Randomize в Delphi

Рейтинг: 0Ответов: 1Опубликовано: 21.05.2011

Использовал Randomize (слышал что исключает повторение), для случайной последовательности от 1 до 10, но мне интересно, что выведет v:=1+Random(9); когда случайности кончаться? чему будет равен v? Объясните пожалуйста доступным языком для начинающего.

Ответы

▲ 4

Принцип большинства алгоритмов получения случайных чисел - новое псевдослучайное значение получается на основе предыдущего значения.

Например, самое простенькое для С:

unsigned long rtrand( void ) {
  rtseed = rtseed * 0x41C64E6D + 0x3039; // получить новое значение случайное
  return (rtseed>>16)&0x7FFF; // обрезать его до нужной величины.
}

И, если программа будет начинаться с одним и тем же начальным значением, то вся цепочка повторится. Сколько угодно раз. Попробуйте посмотреть значения, создаваемые рандомом без этой функции.

Первый запуск программы: 1 9 8 5 7 3 2 9 4 8 (написал наугад)
Второй запуск программы: 1 9 8 5 7 3 2 9 4 8
Третий запуск программы: 1 9 8 5 7 3 2 9 4 8
...

А функция Randomize в качестве начального значения берёт какое-то число, которое всегда разное. Например, время в миллисекундах. Как бы не запускали программу, время уже не повторится.

И все цепочки станут другими.

Первый запуск программы: 3 9 1 7 4 9 2 3 8 2 (написал наугад)
Второй запуск программы: 1 5 6 3 3 4 6 7 2 9
Третий запуск программы: 3 4 8 2 5 1 6 8 3 1
...

Вряд ли вы встретите повторение цепочки при последовательном запросе чисел =) Цепочки там ужасть какие длинные) Не думайте, что ограничивая выходной диапазон, вы заставите его повторяться - ограничение идёт на выходе алгоритма (обычно как остаток от деления return (minval + rtseed mod (maxval - minval)), внутри используются очень большие числа.

И да, не путайте повторение числа - а они будут повторяться, если их немного, - от повторения последовательности псевдослучайных чисел. Самое главное, чтобы эти числа укладывались в заданное случайное распределение =) Что, в принципе, задано алгоритмически и будет выполняться всегда.