كيف تولد عادة توزيع عشوائي من عدد صحيح ؟
-
19-09-2019 - |
سؤال
وبالنظر إلى بداية ونهاية صحيح مجموعة, كيف يمكنني حساب عادة توزيع عشوائي عدد صحيح بين هذا المدى ؟
وأنا أدرك أن التوزيع الطبيعي يذهب إلى+ ما لا نهاية.أعتقد ذيول يمكن القطع ، حتى عندما عشوائي يحصل على حسابها خارج نطاق حساب.هذا يرفع من احتمال الصحيحه في مجموعة ، ولكن طالما أن هذا التأثير مقبولة (<5%) ، لا بأس.
public class Gaussian
{
private static bool uselast = true;
private static double next_gaussian = 0.0;
private static Random random = new Random();
public static double BoxMuller()
{
if (uselast)
{
uselast = false;
return next_gaussian;
}
else
{
double v1, v2, s;
do
{
v1 = 2.0 * random.NextDouble() - 1.0;
v2 = 2.0 * random.NextDouble() - 1.0;
s = v1 * v1 + v2 * v2;
} while (s >= 1.0 || s == 0);
s = System.Math.Sqrt((-2.0 * System.Math.Log(s)) / s);
next_gaussian = v2 * s;
uselast = true;
return v1 * s;
}
}
public static double BoxMuller(double mean, double standard_deviation)
{
return mean + BoxMuller() * standard_deviation;
}
public static int Next(int min, int max)
{
return (int)BoxMuller(min + (max - min) / 2.0, 1.0);
}
}
ربما تحتاج إلى مقياس الانحراف المعياري بعض كيف نسبة إلى طائفة ، ولكن لا أفهم كيف.
الجواب:
// Will approximitely give a random gaussian integer between min and max so that min and max are at
// 3.5 deviations from the mean (half-way of min and max).
public static int Next(int min, int max)
{
double deviations = 3.5;
int r;
while ((r = (int)BoxMuller(min + (max - min) / 2.0, (max - min) / 2.0 / deviations)) > max || r < min)
{
}
return r;
}
المحلول
إذا كان مربع-مولر الأسلوب بإرجاع "المعيار" التوزيع الطبيعي ، وسوف يكون يعني 0 و الانحراف المعياري 1.تحويل التوزيع الطبيعي المعياري ، مضاعفة عدد عشوائي من قبل X للحصول على الانحراف المعياري × إضافة Y للحصول على يعني Y, إذا لم تخني الذاكرة.
ترى مقالة ويكيبيديا قسم تطبيع الطبيعي المعياري لمتغيرات (مكان الإقامة 1) أكثر دليل رسمي.
ردا على تعليقك ، وبحكم التجربة هو أن 99.7% من التوزيع الطبيعي سيكون في حدود +/- 3 مرات الانحراف المعياري.إذا كنت بحاجة إلى التوزيع الطبيعي من 0 إلى 100 على سبيل المثال, مما يعني سوف يكون في منتصف الطريق ، و SD الخاصة بك سوف تكون (100/2)/3 = 16.667.لذا مهما القيم الخروج من المربع الخاص بك-مولر خوارزمية ضرب من قبل 16.667 إلى "التمدد" التوزيع ، ثم إضافة 50 إلى "مركز" عليه.
جون في أحدث تعليق, أنا لست متأكدا ما هو الهدف من Next
وظيفة.دائما يستخدم الانحراف المعياري 1 يعني من منتصف الطريق بين min و max.
إذا كنت تريد يعني من ص ، ~99.7% من الأرقام في نطاق X +X ثم لك فقط اتصل BoxMuller(Y, X/3)
.
نصائح أخرى
حسنا، The -2 * Sigma .. + 2 * سيمنحك Sigma 95٪ من منحنى الجرس. (تحقق من قسم "الفترات الانحراف والثقة المعيارية" في مقالة الويكي المذكورة بالفعل).
لذلك تعديل هذه القطعة:
return (int)BoxMuller(min + (max - min) / 2.0, 1.0);
وتغيير 1.0 (الانحراف المعياري) إلى 2.0 (أو أكثر إذا كنت ترغب في تغطية أكثر من 95٪)
return (int)BoxMuller(min + (max - min) / 2.0, 2.0);