Случайные числа
Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду
Как в Delphi можно сгенерировать случайное число из определённого промежутка?
вот в паскале знаю, а в Delphi ... не знаю =(
Функция RandG( Mean, StdDev: Extended ): Extended;
Модуль: Math
Функция генерирует случайное число с отклонением по Гауссу от среднего значения Mean. Возращаемое значение будет лежать в диапазоне Mean-StdDev ... Mean+StdDev.
Функция Random [( Range: Integer );
Модуль: System
Функция генерирует случайное целое число в заданном диапазоне [0…Range).
Параметр Range является необязательным. Если данный параметр опущен, то функция возвращает число действительного типа в диапазоне [0…1).
Генератор случайных чисел инициализируется процедурой Randomize. Если не производить инициализацию, то при каждом запуске программы, функция Random будет возвращать одну и ту же последовательность чисел. Если необходимо сгенерировать определенную последовательность, то для этого нужно присвоить системной переменной RandSeed: LongInt конкретное значение. При этом следует помнить, что в разных версиях компилятора используются различные алгоритмы генерирования последовательностей значений. По этому не рекомендуется использовать функцию Random для шифровки-дешифровки данных (т.е. когда необходимо генерировать одинаковые псевдослучайные последовательности чисел).
Функция Randomize;
Модуль: System
Процедура инициализирует генерацию случайных чисел со случайного значения, используя текущее значение системного времени.
Если не инициализировать генератор случайных чисел с помощью данной процедуры, то при каждом запуске программы будет генерироваться одна и та же последовательность чисел. Для генерации определенной последовательности, необходимо системной переменной RandSeed: LongInt присвоить конкретное значение.
Модуль: Math
Функция генерирует случайное число с отклонением по Гауссу от среднего значения Mean. Возращаемое значение будет лежать в диапазоне Mean-StdDev ... Mean+StdDev.
Код: Выделить всё
var
X: Real;
begin
Randomize;
X:= RandG(100,10); { 90<=X<=110 }
end;
Модуль: System
Функция генерирует случайное целое число в заданном диапазоне [0…Range).
Параметр Range является необязательным. Если данный параметр опущен, то функция возвращает число действительного типа в диапазоне [0…1).
Генератор случайных чисел инициализируется процедурой Randomize. Если не производить инициализацию, то при каждом запуске программы, функция Random будет возвращать одну и ту же последовательность чисел. Если необходимо сгенерировать определенную последовательность, то для этого нужно присвоить системной переменной RandSeed: LongInt конкретное значение. При этом следует помнить, что в разных версиях компилятора используются различные алгоритмы генерирования последовательностей значений. По этому не рекомендуется использовать функцию Random для шифровки-дешифровки данных (т.е. когда необходимо генерировать одинаковые псевдослучайные последовательности чисел).
Код: Выделить всё
var
X: Real;
begin
Randomize;
X:= Random; { 0<=X<1 }
end;
Модуль: System
Процедура инициализирует генерацию случайных чисел со случайного значения, используя текущее значение системного времени.
Если не инициализировать генератор случайных чисел с помощью данной процедуры, то при каждом запуске программы будет генерироваться одна и та же последовательность чисел. Для генерации определенной последовательности, необходимо системной переменной RandSeed: LongInt присвоить конкретное значение.
- SergeyS
- Сообщения: 196
- Зарегистрирован: 21 ноя 2006, 17:12
- Откуда: Хакасия, Абакан
- Контактная информация:
Код: Выделить всё
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;
-
- Сообщения: 230
- Зарегистрирован: 31 авг 2006, 13:11
в Delphi точно также как и в паскале ))))))))EgorX писал(а):вот в паскале знаю, а в Delphi ... не знаю =(
А зря не рекомендуется (по моему), ведь эту псевдослучайно сгенерированую последовательность можно записать в определьонное место шифруемого файла, а потом использовать как ключ к дешифровке. Зашифрованый таким способом файл будет труднее расшифровать кому-то левому, кто этого не не должен делать.Duncon писал(а): При этом следует помнить, что в разных версиях компилятора используются различные алгоритмы генерирования последовательностей значений. По этому не рекомендуется использовать функцию Random для шифровки-дешифровки данных (т.е. когда необходимо генерировать одинаковые псевдослучайные последовательности чисел).
Кстати вспомнил прикольную игрушку на Паскале, которой незнаю сколько уже лет.
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.
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.
В свое время не знал, как генерить случайные числа на asm... И хорошо... Зато изучил работу с таймером, т.к. генерация случайных чисел работала через таймер, получая 16 бит из ПЗУ BIOS по смещению, которое выдавал его счетчик. Конечно, ни ахти случайность, но для работы очень многих программ подходила вполне...
It's a long way to the top if you wanna rock'n'roll
Somewhere, а какой объем ПЗУ БИОСа? У меня просто такое чувство, что некоторые комбинации там вполне себе могут не встретиться
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
64k, начиная с $f000. Счетчик давал число от 0..65535, я использовал только 14 бит - соответственно получал данные (состоят из кода вперемешку с текстом) из первых 16К ПЗУ. Конечно не встретятся, но для многих программ достаточно.
It's a long way to the top if you wanna rock'n'roll