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

Модераторы: Duncon, Naeel Maqsudov, Хыиуду, Игорь Акопян

Ответить
Yura_ua
Сообщения: 63
Зарегистрирован: 07 дек 2006, 17:52

10 мар 2007, 14:23

Как в Delphi можно сгенерировать случайное число из определённого промежутка?
EgorX
Сообщения: 16
Зарегистрирован: 18 фев 2007, 07:55

10 мар 2007, 14:28

вот в паскале знаю, а в Delphi ... не знаю =(
Аватара пользователя
Duncon
Сообщения: 1974
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

10 мар 2007, 14:49

Функция 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 присвоить конкретное значение.
Аватара пользователя
SergeyS
Сообщения: 193
Зарегистрирован: 21 ноя 2006, 17:12
Откуда: Хакасия, Абакан
Контактная информация:

10 мар 2007, 16:23

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

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;
namomelkor
Сообщения: 227
Зарегистрирован: 31 авг 2006, 13:11

12 мар 2007, 11:10

EgorX писал(а):вот в паскале знаю, а в Delphi ... не знаю =(
в Delphi точно также как и в паскале ))))))))
Yura_ua
Сообщения: 63
Зарегистрирован: 07 дек 2006, 17:52

12 мар 2007, 22:13

Duncon писал(а): При этом следует помнить, что в разных версиях компилятора используются различные алгоритмы генерирования последовательностей значений. По этому не рекомендуется использовать функцию Random для шифровки-дешифровки данных (т.е. когда необходимо генерировать одинаковые псевдослучайные последовательности чисел).
А зря не рекомендуется (по моему), ведь эту псевдослучайно сгенерированую последовательность можно записать в определьонное место шифруемого файла, а потом использовать как ключ к дешифровке. Зашифрованый таким способом файл будет труднее расшифровать кому-то левому, кто этого не не должен делать.
Yura_ua
Сообщения: 63
Зарегистрирован: 07 дек 2006, 17:52

12 мар 2007, 22:26

Кстати вспомнил прикольную игрушку на Паскале, которой незнаю сколько уже лет.

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.
Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

13 мар 2007, 17:02

В свое время не знал, как генерить случайные числа на asm... И хорошо... Зато изучил работу с таймером, т.к. генерация случайных чисел работала через таймер, получая 16 бит из ПЗУ BIOS по смещению, которое выдавал его счетчик. Конечно, ни ахти случайность, но для работы очень многих программ подходила вполне...
It's a long way to the top if you wanna rock'n'roll
Хыиуду
Сообщения: 2388
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

14 мар 2007, 10:03

Somewhere, а какой объем ПЗУ БИОСа? У меня просто такое чувство, что некоторые комбинации там вполне себе могут не встретиться
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

14 мар 2007, 12:09

64k, начиная с $f000. Счетчик давал число от 0..65535, я использовал только 14 бит - соответственно получал данные (состоят из кода вперемешку с текстом) из первых 16К ПЗУ. Конечно не встретятся, но для многих программ достаточно.
It's a long way to the top if you wanna rock'n'roll
Ответить