-
- На мой взгляд, единственный разумный вариант тогда, что-то вроде (m
* rand() >> 15) % m. fk0(68 знак., 17.11.2020 02:55, ссылка)
- Любая попытка превратить равномерное распределение [0..n-1] в
равномерное же распределение [0..m-1] чистой функцией обречена на
провал, если n%m != 0. Если у нас на входе всего 32768 разных
значений X, которые мы хотим превратить в 1000 значений Y, нужно
смириться с тем, что на некоторые Y отобразится 32 значения X, а на
некоторые 33, и это ещё в лучшем случае. По ссылке как раз
предлагается простой вариант: для m==1000 значения rand() в
диапазоне [32000..32767] считать йцyкeн(79 знак., 17.11.2020 12:48)
- Ёлы-палы, нет задачи изобрести вечную иглу для примуса. Более того,
это вредно. Один раз изобрёл, а потом кто зряплату платить будет? - SciFi(17.11.2020 13:09)
- Да речь не о равномерности, а о том, что выражения rand()%max
следует избегать т.к. в rand() младшие биты якобы "плохие" (о чём
RxTx писал). Соответственно идея в том, чтоб откинуть часть младших
бит. Вариант с зацикливнием меня пугает для случая, когда за rand()
стоит настоящий ГПСЧ. В линуксе программы висящие на чтении
/dev/random потому, что "не хватает энтропии" все наверное видели,
особенно после загрузки, и особенно ssh... - fk0(17.11.2020 13:08)
- Мне с генераторами с.ч. пришлось разобраться еще на спектруме,
начиная с тех времен когда попадался какой-то интересный код или
когда я пытался нарисовать звезды на экране, а получались столбцы.
Во-первых я выписал ряд кодов гсч (все они были самопальщиной, за
исключением генератора Elite), во-вторых, благодаря вовремя
попавшей в руки брошюрке разобрался как работает линейный
конгруэнтный генератор. Слов во всяких википедиях тонны, но на деле
все просто. Есть текущее RxTx(4109 знак., 17.11.2020 05:15, ссылка)
- Да, тут ещё ошибка: интервал это от нуля, до RAND_MAX включительно. - fk0(17.11.2020 02:46)