Но настолько широко, что очень и очень многие применения вызывают многие сомнения!
Примеры того (независимо от языков программирования):
1. Встречаю на нескольких сайтах / форумах код, моделирующий примитивную игру в кости - выбрасывают 2 кубика, и результат формируют как:
Код: Выделить всё
int n1 = rand() % 12 + 1;
Ребята, сумма 2-х равномерно распределённых случайных величин не имеет равномерного распределения!
Можно только отдельно моделировать выпадание каждого из кубиков 1...6 и складывать эти значения.
Более того:
1А. Известен способ Хеминга (основанный на центральной предельной теореме) генерации нормально распределённых случайных величин: сумма 12-ти последовательно сгенерированных равномерно распределённыхв диапазоне [0...1) чисел даёт нормально расределённую случайную величину с средним значением 6 и дисперсией (и средне-квадратичным отклонением, сигма) = 1. Дальше это число можно центрировать (вычесть 6) и получить желаемую нормальную случайную величину.
2. Но страшнее всего, что я вижу повсеместно - это когда хотят сгенерировать величину в диапазоне [0...N) (вместо [0...RAND_MAX)) записывают это так:
Код: Выделить всё
int n2 = rand() % N
Потому что мы используем при этом остатки случайной величины, младшие разряды.
Но, если относительно rand() (и аналогов в разных языках) известно и как-то доказано: а). что значение имеет равномерное распределение + б). этот генератор имеет достаточно хорошее "качество" - то относительно остатков нельзя гарантировано утверждать ни 1-е ни 2-е!
Как можно сделать нормирование к [0...N) диапазону?
Могу предложить (как черновые, на вскидку) такие способы:
Код: Выделить всё
int n2 = ( (unsigned long long)rand() * N ) / RAND_MAX;
Код: Выделить всё
int n2 = floor( (double)rand() * N / RAND_MAX );
Оценивание качества ГСЧ - это мудрёная штука (см. 2-й том Кнутта) - далеко не всё, что кажется случайным, можно использовать с качестве случайных чисел.
Пока соберу только некоторые ссылки на этот предмет ... оценивания качества и нормализации к диапазону:
Генераторы случайных чисел
Тестирование псевдослучайных последовательностей