Страница 1 из 1

Случайные числа

Добавлено: 10 мар 2007, 14:23
Yura_ua
Как в Delphi можно сгенерировать случайное число из определённого промежутка?

Re: Случайные числа

Добавлено: 10 мар 2007, 14:28
EgorX
вот в паскале знаю, а в Delphi ... не знаю =(

Re: Случайные числа

Добавлено: 10 мар 2007, 14:49
Duncon
Функция RandG( Mean, StdDev: Extended ): Extended;
Модуль: Math
Функция генерирует случайное число с отклонением по Гауссу от среднего значения Mean. Возращаемое значение будет лежать в диапазоне Mean-StdDev ... Mean+StdDev.

Код: Выделить всё

var
  X: Real;
begin
  Randomize;
  X:= RandG(100,10);     { 90<=X<=110 }
end;
Функция Random [( Range: Integer );
Модуль: System
Функция генерирует случайное целое число в заданном диапазоне [0…Range).
Параметр Range является необязательным. Если данный параметр опущен, то функция возвращает число действительного типа в диапазоне [0…1).
Генератор случайных чисел инициализируется процедурой Randomize. Если не производить инициализацию, то при каждом запуске программы, функция Random будет возвращать одну и ту же последовательность чисел. Если необходимо сгенерировать определенную последовательность, то для этого нужно присвоить системной переменной RandSeed: LongInt конкретное значение. При этом следует помнить, что в разных версиях компилятора используются различные алгоритмы генерирования последовательностей значений. По этому не рекомендуется использовать функцию Random для шифровки-дешифровки данных (т.е. когда необходимо генерировать одинаковые псевдослучайные последовательности чисел).

Код: Выделить всё

var
  X: Real;
begin
  Randomize;
  X:= Random;     { 0<=X<1 }
end;
Функция Randomize;
Модуль: System
Процедура инициализирует генерацию случайных чисел со случайного значения, используя текущее значение системного времени.
Если не инициализировать генератор случайных чисел с помощью данной процедуры, то при каждом запуске программы будет генерироваться одна и та же последовательность чисел. Для генерации определенной последовательности, необходимо системной переменной RandSeed: LongInt присвоить конкретное значение.

Re: Случайные числа

Добавлено: 10 мар 2007, 16:23
SergeyS

Код: Выделить всё

var
  X: Real;
  min, max: Real;
begin
  min := 10;
  max := 20;
  Randomize;
  X:= min + Random * (max - min);     { Random возвращает число лежащее в интервале [0..1) }
  { X будет лежать в интервале [min..max), если его округлить тогда будет лежать в промежутке [min..max] }
end;

Re: Случайные числа

Добавлено: 12 мар 2007, 11:10
namomelkor
EgorX писал(а):вот в паскале знаю, а в Delphi ... не знаю =(
в Delphi точно также как и в паскале ))))))))

Re: Случайные числа

Добавлено: 12 мар 2007, 22:13
Yura_ua
Duncon писал(а): При этом следует помнить, что в разных версиях компилятора используются различные алгоритмы генерирования последовательностей значений. По этому не рекомендуется использовать функцию Random для шифровки-дешифровки данных (т.е. когда необходимо генерировать одинаковые псевдослучайные последовательности чисел).
А зря не рекомендуется (по моему), ведь эту псевдослучайно сгенерированую последовательность можно записать в определьонное место шифруемого файла, а потом использовать как ключ к дешифровке. Зашифрованый таким способом файл будет труднее расшифровать кому-то левому, кто этого не не должен делать.

Re: Случайные числа

Добавлено: 12 мар 2007, 22:26
Yura_ua
Кстати вспомнил прикольную игрушку на Паскале, которой незнаю сколько уже лет.

Program SuRulet;
Uses crt;
Procedure play;
Var n,g:integer;
Begin
randomize;
n:=random(10);
writeln('Загадано целое число от 0 до 10. Попробуйте угадать:');
readln(g);
while g<>n do
begin
writeln('Вы не угадали!');
if g<n then writeln('Ваше число меньшезадуманого.') else writeln('Ваше число больше задуманого.');
writeln('Попробуйте ещё раз:');
readln(g);
end;
writeln('Поздравляю! Вы угадали.');
readln;
end;
Begin
textbackground(white);
textcolor(black);
clrscr;
gotoxy(32,4);
writeln('Рулетка');
writeln('--------------------------------------------------------------------------------');
play;
readln;
end.

Re: Случайные числа

Добавлено: 13 мар 2007, 17:02
somewhere
В свое время не знал, как генерить случайные числа на asm... И хорошо... Зато изучил работу с таймером, т.к. генерация случайных чисел работала через таймер, получая 16 бит из ПЗУ BIOS по смещению, которое выдавал его счетчик. Конечно, ни ахти случайность, но для работы очень многих программ подходила вполне...

Re: Случайные числа

Добавлено: 14 мар 2007, 10:03
Хыиуду
Somewhere, а какой объем ПЗУ БИОСа? У меня просто такое чувство, что некоторые комбинации там вполне себе могут не встретиться

Re: Случайные числа

Добавлено: 14 мар 2007, 12:09
somewhere
64k, начиная с $f000. Счетчик давал число от 0..65535, я использовал только 14 бит - соответственно получал данные (состоят из кода вперемешку с текстом) из первых 16К ПЗУ. Конечно не встретятся, но для многих программ достаточно.