Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Неслучайный random


Автор: AlexSam 17.11.2005, 22:20
Может я что не так делабаю . Использую в проге генератор случайных чисел (random) .Числа то конечно случайные , но при каждом новом запуске программы генерируется одна и таже последовательность этих чисел (0 , 5 , 9 , 11 , 15 , 33 , 3 ,...), как мне сделать , чтобы при каждом новом запуске генерировались разные числа.

Автор: darkart 17.11.2005, 22:26
Надо вызвать randomize до первого random.

Автор: Poseidon 17.11.2005, 22:31
AlexSam, видно ты еще новичок. Вот, держи:
Цитата
Random - Генерирует последовательность целых или действительных случайных чисел

Модуль System

Объявление
function Random (Range: Integer);

Описание
Функция Random генерирует последовательность целых или действительных случайных чисел. Парметр Range не является обязательным. Если этот параметр не задан, то функция возвращает случайные действительные числа X
, равномерно распределенные в интервале 0  <= X < 1. Например, оператор


for i:=Low(A) to High(A) do
  A[i] := Random;

заполняет массив A равномерно распределенными действительными числами в диапазоне от 0 до 1. Если вам требуются действительные случайные числа X
, равномерно распределенные в каком-то другом диапазоне A1 <= X < A2, то такие действительные числа легко получить, сдвинув начальное значение чисел и умножив генерируемые числа на длину интервала. Например, операторы


A1, A2: double;
...
A1 := 50;
A2 := 150;
for i:=Low(A) to High(A) do
  A[i] := A1 + (A2 - A1) * Random;

обеспечивают заполнение массива действительными случайными числами X, лежащими в диапазоне 50 <= X < 150.
Если в функции Random задан параметр Range, то функция возвращает случайные целые числа в диапазоне 0 <= X < Range. Например, оператор


for i:=Low(M) to High(M) do
  M[i] := Random(101);

заполняет массив M целыми числами, равномерно распределенными в диапазоне от 0 до 100. А оператор


for i:=Low(M) to High(M) do
  M[i] := 100 + Random(101);

заполняет массив M целыми числами, равномерно распределенными в диапазоне от 100 до 200.
Для рандомизации генератора Random используется процедура Randomize.


Цитата
Randomize - Рандомизирует генераторы случайных чисел

Модуль System

Объявление
procedure Randomize;

Описание
Процедура Randomize рандомизирует функции генерации случайных чисел Random и RandG. Если не использовать процедуру Randomize, то при каждом запуске на выполнение функции Random и RandG будут генерировать одинаковые последовательности квазислучайных чисел. Если же вставить в код процедуру Randomize, например, в событии OnCreate формы, то при каждом запуске последовательности случайных чисел будут разными.

Автор: FRAGNATIC 17.11.2005, 22:40
Код

procedure TForm1.Button1Click(Sender: TObject);
begin
randomize;
Edit1.Text := Format('%s%s%s%s%s%s%s%s', [chr(random(9) + 49), chr(random(10) + 48), chr(random(10) + 48), chr(random(10) + 48), chr(random(10) + 48), chr(random(10) + 48), chr(random(10) + 48), chr(random(10) + 48)]);
end;

Автор: Rrader 18.11.2005, 08:14
AlexSam
Чтобы было понятно, почему так генерируются числа, посмотри исходники Randomize:
Код

...
Var
  RandSeed: Longint = 0;
...

Procedure Randomize;
Var
  Counter: Int64;
Begin
  If QueryPerformanceCounter(Counter) Then
    RandSeed := Counter
  Else
    RandSeed := GetTickCount; // Возвращает время работы Windows
End;

Когда работает Random, он использует переменную RandSeed. По умолчанию она равна нулю. Если не вызвать Randomize, как видно, RandSeed так и останется равной нулю smile

Автор: AlexSam 18.11.2005, 16:06
Спасибо всем . теперь понял. smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)