Как получать разные числа
- From
- Evgenij Masherov (2:5020/175.2)
- To
- Yuri Muhitov
- Date
- 2002-10-23T20:29:23Z
- Area
- RU.ALGORITHMS
From: "Evgenij Masherov" <EMasherow@nsi.ru>
Wed Oct 23 2002 19:30, Yuri Muhitov wrote to Evgenij Masherov:
EM>> Посмотрите randomize()
YM> Это из какой среды / библиотеки / языка ?
YM> Мне вот посоветовали srand () - стандартный С ( для него и искал ).
Для начала, поскольку эха все же не об особенностях языков/сред, поговорим об
_алгоритмах_ генерации случайных чисел. Само это название содержит внутреннюю
противоречивость, поскольку одно из фундаментальнейших свойств алгоритмов -
определенность, исключающая всякую случайность. Посему алгоритмически мы можем
создавать только _псевдослучайные_ числа, следующие одно за другим в
однозначно определенной последовательности. Истинно же случайные числа могут
быть лишь сняты с некоего устройства, будь то аппаратный датчик на материнской
плате последних выпусков, электронная рулетка, некогда побежденная Генеральным
Инспектором Юрковским (и содержавшая, в нашем отражении, источник
радиоактивного распада, что делало ее выход принципиально непредсказуемым),
младшие биты ввода звуковой карты или таймера. Аппаратные ГСЧ имеют
принципиально невоспроизводимый выход, низкую производительность, недостаточно
стабильные статистические характеристики и т.п. Поэтому на практике используют
псевдослучайные генераторы (мультипликативный - когда число, полученное на
предыдущем шаге, умножают на коэффициент, прибавляют сдвиг и берут остаток по
модулю, выдают пользователю - и запоминают для следующего вызова; сдвиговый,
когда элементарные операции - сдвиг битового вектора и исключающее ИЛИ оного с
маской; середины квадрата, ныне полузабытый, когда, возведя число в квадрат,
отбрасывают начальные и конечные разряды; Фибоначчиев - и все прочие, знакомые
тем, кто когда-либо истязал себя Кнутом, т.2, гл.3). Независимо от их
устройства, все они сохраняют состояние от вызова к вызову X(i+1)=f(X(i)), так
что при каждом запуске программы выдают одну и ту же последовательность чисел.
Желая получить при разных вызовах разные последовательности - прежде первого
обращения меняем начальную установку, чем и занимается функция randomize(),
которая принадлежит к stdlib.h , то есть к самым что ни на есть стандартным
функциям С и, как можно догадаться, инициализируется по таймеру.
Функция же srand(seed) столь же однозначно алгоритмична, но, в отличие от
rand() или random(num) позволяет явно указать начальное значение датчика,
которое Вы должны при начале работы программы менять, скажем, от таймера, по
запросу оператора или как-то иначе.
Евгений Машеров АКА СанитарЖеня
--- ifmail v.2.15dev5
* Origin: FidoNet Online - http://www.fido-online.com (2:5020/175.2)