|
|
ru.algorithms- RU.ALGORITHMS ---------------------------------------------------------------- From : Evgenij Masherov 2:5020/175.2 23 Oct 2002 20:29:23 To : Yuri Muhitov Subject : Как получать разные числа -------------------------------------------------------------------------------- Wed Oct 23 2002 19:30, Yuri Muhitov wrote to Evgenij Masherov: EM>> Посмотрите randomize() YM> Это из какой среды / библиотеки / языка ? YM> Мне вот посоветовали srand () - стандартный С ( для него и искал ). Для начала, поскольку эха все же не об особенностях языков/сред, поговорим об _алгоритмах_ генерации случайных чисел. Само это название содержит внутреннюю противоречивость, поскольку одно из фундаментальнейших свойств алгоритмов - определенность, исключающая всякую случайность. Посему алгоритмически мы можем создавать только _псевдослучайные_ числа, следующие одно за другим в однозначно определенной последовательности. Истинно же случайные числа могут быть лишь сняты с некоего устройства, будь то аппаратный датчик на материнской плате последних выпусков, электронная рулетка, некогда побежденная Генеральным Инспектором Юрковским (и содержавшая, в нашем отражении, источник радиоактивного распада, что делало ее выход принципиально непредсказуемым), младшие биты ввода звуковой карты или таймера. Аппаратные ГСЧ имеют принципиально невоспроизводимый выход, низкую производительность, недостаточно стабильные статистические характеристики и т.п. Поэтому на практике используют псевдослучайные генераторы (мультипликативный - когда число, полученное на предыдущем шаге, умножают на коэффициент, прибавляют сдвиг и берут остаток по модулю, выдают пользователю - и запоминают для следующего вызова; сдвиговый, когда элементарные операции - сдвиг битового вектора и исключающее ИЛИ оного с маской; середины квадрата, ныне полузабытый, когда, возведя число в квадрат, отбрасывают начальные и конечные разряды; Фибоначчиев - и все прочие, знакомые тем, кто когда-либо истязал себя Кнутом, т.2, гл.3). Hезависимо от их устройства, все они сохраняют состояние от вызова к вызову 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) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.algorithms/33006db398f2.html, оценка из 5, голосов 10
|