سؤال

أرغب في إنشاء رقم فاصلة عائمة عشوائي بين قيمتين.ما هي أفضل طريقة للقيام بذلك في C#؟

هل كانت مفيدة؟

المحلول

الشيء الوحيد الذي أود أن أضيف إليه اريكرد هو تفسير.أشعر أن معرفة سبب عمل الكود أفضل من معرفة الكود الذي يعمل.

التفسير هو هذا:لنفترض أنك تريد رقمًا يتراوح بين 2.5 و4.5.النطاق هو 2.0 (4.5 - 2.5). NextDouble تقوم بإرجاع رقم بين 0 و1.0 فقط، ولكن إذا قمت بضرب هذا في النطاق فستحصل على رقم بين 0 و1.0 يتراوح.

لذا، فإن هذا سيعطينا مضاعفات عشوائية بين 0.0 و2.0:

rng.NextDouble() * 2.0

لكننا نريدهم بين 2.5 و 4.5!كيف نفعل ذلك؟أضف أصغر رقم، 2.5:

2.5 + rng.NextDouble() * 2.0

الآن، حصلنا على رقم بين 0.0 و2.0؛إذا أضفت 2.5 إلى كل من هذه القيم، فسنرى أن النطاق الآن يتراوح بين 2.5 و4.5.

في البداية اعتقدت أنه من المهم إذا كانت b > a أو a > b، ولكن إذا قمت بحلها في كلا الاتجاهين فستجد أنها تعمل بشكل متماثل طالما أنك لا تفسد ترتيب المتغيرات المستخدمة.أحب التعبير عنها بأسماء متغيرة أطول حتى لا أختلط الأمر:

double NextDouble(Random rng, double min, double max)
{
    return min + (rng.NextDouble() * (max - min));
}

نصائح أخرى

System.Random r = new System.Random();

double rnd( double a, double b )
{
   return a + r.NextDouble()*(b-a);
}
// generate a random number starting with 5 and less than 15
Random r = new Random();
int num = r.Next(5, 15);  

بالنسبة للزوجي، يمكنك استبدال Next بـ NextDouble

فيما يلي مقتطف من كيفية الحصول على أرقام عشوائية آمنة للتبريد:سيؤدي هذا إلى ملء البايتات الثمانية بتسلسل قوي من الناحية التشفيرية للقيم العشوائية.

byte[] salt = new byte[8];
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
rng.GetBytes(salt);

لمزيد من التفاصيل انظر ما مدى عشوائيتك؟؟ (مستوحاة من مقالة CodingHorror حول خلط سطح السفينة)

كيف عشوائية؟إذا كان بإمكانك التعامل مع العشوائية الزائفة، فببساطة:

Random randNum = new Random();
randNum. NextDouble(Min, Max);

إذا كنت تريد رقمًا عشوائيًا "أفضل"، فمن الأفضل أن تنظر إلى خوارزمية Mersenne Twister.الكثير من الناس لديهم نفذته بالفعل بالنسبة لك بالرغم من ذلك

للحصول على شرح لسبب تعديل Longhorn كثيرًا: http://msdn.microsoft.com/en-us/magazine/cc163367.aspx ابحث عن تنفيذ NextDouble وشرح ما هو المضاعفة العشوائية.

يعد هذا الرابط أيضًا مثالًا رائعًا لكيفية استخدام الأرقام العشوائية المشفرة (مثل ما ذكره سمير) فقط مع المخرجات المفيدة الفعلية بدلاً من تدفق البتات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top