Добрый день, уважаемые!
Тут такая мысль нарисовалась
Мне необходимо с равновероятным разбросом получать случайные числа в диапазоне от 1 до 5. Очевидно, что rand(5) не даст такой равномерности. А что общественность скажет вот о таком псевдокоде:
randomize();
int getRand(int seed) {
int added = 1000;
return ( (int) rand(seed*added)/added );
}
Будет ли он давать более равномерное распределение (в частности, интересует интервал от 1 до 10)? И есть ли "магическое" значение переменной
added, которое дает более равномерное распределение?
Здравствуйте Flamer, Вы писали:
F>Добрый день, уважаемые!
F>Тут такая мысль нарисовалась
F>Мне необходимо с равновероятным разбросом получать случайные числа в диапазоне от 1 до 5. Очевидно, что rand(5) не даст такой равномерности. А что общественность скажет вот о таком псевдокоде:
F>
F>randomize();
F>int getRand(int seed) {
F> int added = 1000;
F> return ( (int) rand(seed*added)/added );
F>}
F>
F>Будет ли он давать более равномерное распределение (в частности, интересует интервал от 1 до 10)? И есть ли "магическое" значение переменной added, которое дает более равномерное распределение?
А что это за функция
rand(int)???
А такой вариант не устроит?
rand()%5;
На выборке в 10000 элементов дает отклонение от идеала до 5%.
На выборке в 100000 элементов — до 0.6%.
Здравствуйте Flamer, Вы писали:
F>Добрый день, уважаемые!
F>Тут такая мысль нарисовалась
F>Мне необходимо с равновероятным разбросом получать случайные числа в диапазоне от 1 до 5. Очевидно, что rand(5) не даст такой равномерности. А что общественность скажет вот о таком псевдокоде:
F>
F>randomize();
F>int getRand(int seed) {
F> int added = 1000;
F> return ( (int) rand(seed*added)/added );
F>}
F>
F>Будет ли он давать более равномерное распределение (в частности, интересует интервал от 1 до 10)? И есть ли "магическое" значение переменной added, которое дает более равномерное распределение?
Ммм, а что это у тебя за функция rand(int)?
Теперь по теме. Тебе, насколько я понял, нужны равновероятные целые числа 1 2 ... 5 ?
Есть два варианта:
1) делаешь (1 + rand()%5) — очень просто, но не совсем равновероятно в случае, если RAND_MAX%5 не равно нулю;
2) получаем равномерное распределение на [0,1] и разбиваем на n частей, в твоем случае:
получаешь double x = (double)rand() / RAND_MAX. Если 0<x<0.2 от возвращаем 1, если 0.2<x<0.4 возвращаем 2 и т.д.
B>А что это за функция
B>B>rand(int)???
B>
Сорри, апшипся, конечно, хотел написать
random
Здравствуйте Flamer, Вы писали:
F>Мне необходимо с равновероятным разбросом получать случайные числа в диапазоне от 1 до 5.
может поможет
Генерируй массив и вычисли автокорреляционную функцию и увидишь насколько "равномерен" твой алгоритм