07.12.2007

LCG

О псевдослучайных числах, о простейшем и старейшем методе их генерации. Поэтому сегодня разбирался с LCG - Linear Congruential Generator. Перевод на русский с толчка википедии звучит так: линейный конгруэнтный метод. Если вы используете rand() - это значит вы используете LCG. Что там есть.. там есть по одной операции умножения, сложения, деления и остатка. При большом кол-ве вызовов(например в цикле) производительность будет резать call. И никак мы этот rand() не сделаем inline, crt шняга. Для этого можно написать свою реализацию.
Ещё одна особенность в crt реализации: видели чему равна RAND_MAX? Даже если не видели - 0x7fff, равное 32767. Значит диапазон чисел от 0 до 32767. Знаете почему так? Число у них бегает 32битное. Они режут часть младших бит, т.к. их поведение далеко от случайного. А вот в старших битах типо всё отл. Получаем генерацию типо нормальных псевдослучайных чисел в диапазоне 0..32767. При этом период равен 2 в степени 32.
Сейчас использование LCG не очень оправдано, потому что всегда на смену всему старому приходит что-то новое. Почитайте об Mersenne Twister, если вы ещё не знаете что такое.

Комментариев нет:

Отправить комментарий