Генератор случайных чисел имеет состояние - это на самом деле необходимая функция. Следующее «случайное» число является функцией предыдущего номера и состояния seed/state. Пуристы называют их генераторами псевдослучайных чисел. Числа будут проходить статистические тесты для случайности, но не являются - фактически - случайными.
Последовательность случайных значений конечна и повторяется.
Подумайте о генераторе случайных чисел, перетасовывая набор чисел, а затем отправляя их в случайном порядке. Семя используется для «перетасовки» чисел. После того, как семя установлено, последовательность чисел является фиксированной и очень трудно предсказать. Некоторые семена будут повторяться раньше других.
Большинство генераторов имеют период, который достаточно длинный, и никто не заметит его повторения. 48-разрядный генератор случайных чисел будет производить несколько сотен миллиардов случайных чисел до повторения - с (AFAIK) любое 32-битное начальное значение.
Генератор будет только генерирует случайные значения, когда вы даете ему одно семя и позволяете ему изрыгать значения. Если вы меняете семена, то числа, сгенерированные с новым начальным значением, могут не казаться случайными по сравнению со значениями, генерируемыми предыдущим семенем - при смене семестра все ставки отключены. Так не надо.
Звуковой подход состоит в том, чтобы иметь один генератор и «обрабатывать» числа вокруг вашим различным клиентам. Не вмешивайтесь в создание и отбрасывание генераторов. Не смешивайте с меняющимися семенами.
Прежде всего, никогда не пытайтесь написать свой собственный генератор случайных чисел. Встроенные генераторы в большинстве языковых библиотек действительно хороши. Особенно современные, которые используют более 32 бит.
Некоторые дистрибутивы Linux имеют устройства /dev/random
и /dev/urandom
. Вы можете прочитать их один раз, чтобы засеять генератор случайных чисел вашего приложения. Они имеют более или менее случайные значения, но они работают путем «сбора шума» от случайных системных событий. Используйте их экономно, поэтому между использованием существует множество случайных событий.
как бы вы обеспечить случайное семя тогда? есть другой генератор случайных чисел, генерирующих семя? – Jimmy 2008-10-15 15:58:04
Нет; используйте что-то вроде системного времени, смешанного с ip чего-то. – TraumaPony 2008-10-16 08:50:42