Равномерное распределение
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 26.06.02 05:30
Оценка:
Добрый день, уважаемые!

Тут такая мысль нарисовалась

Мне необходимо с равновероятным разбросом получать случайные числа в диапазоне от 1 до 5. Очевидно, что rand(5) не даст такой равномерности. А что общественность скажет вот о таком псевдокоде:




randomize();

int getRand(int seed) {

      int added = 1000;
      return ( (int) rand(seed*added)/added );

}


Будет ли он давать более равномерное распределение (в частности, интересует интервал от 1 до 10)? И есть ли "магическое" значение переменной added, которое дает более равномерное распределение?
Re: Равномерное распределение
От: Bell Россия  
Дата: 26.06.02 06:12
Оценка:
Здравствуйте 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%.
Любите книгу — источник знаний (с) М.Горький
Re: Равномерное распределение
От: yogi Россия  
Дата: 26.06.02 06:19
Оценка: 12 (2)
Здравствуйте 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 и т.д.
Путь к сердцу женщины лежать не должен.
Re[2]: Равномерное распределение
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 26.06.02 07:01
Оценка:
B>А что это за функция
B>
B>rand(int)???
B>


Сорри, апшипся, конечно, хотел написать random
Re: Равномерное распределение
От: Юнусов Булат Россия  
Дата: 26.06.02 10:44
Оценка:
Здравствуйте Flamer, Вы писали:
F>Мне необходимо с равновероятным разбросом получать случайные числа в диапазоне от 1 до 5.

может поможет
Re: Равномерное распределение
От: SergVlad  
Дата: 29.06.02 07:38
Оценка:
Генерируй массив и вычисли автокорреляционную функцию и увидишь насколько "равномерен" твой алгоритм
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.