Последние записи
- TChromium (CEF3), сохранение изображений
- Как в Delphi XE обнулить таймер?
- Изменить цвет шрифта TextBox на форме
- Ресайз PNG без потери прозрачности
- Вывод на печать графического файла
- Взаимодействие через командную строку
- Перенести программу из Delphi в Lazarus
- Определить текущую ОС
- Автоматическая смена языка (раскладки клавиатуры)
- Сравнение языков на массивах. Часть 2
Интенсив по Python: Работа с API и фреймворками 24-26 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки?
Slurm подготовили для вас особенный продукт! Оставить заявку по ссылке - https://slurm.club/3MeqNEk
Online-курс Java с оплатой после трудоустройства. Каждый выпускник получает предложение о работе
И зарплату на 30% выше ожидаемой, подробнее на сайте академии, ссылка - ttps://clck.ru/fCrQw
7th
Мар
Генератор псевдо-случайных чисел (ПСЧ). Как образуются случайные числа?
Posted by obzor under Delphi, Статьи
Решил написать статью о том, как работает генератор случайных чисел. С помощью функции Random можно узнать какое «случайное» число выдаст программа.
1. Как работает процедура Randomize?
Процедура Randomize инициализирует генератор случайных чисел, задавая значение переменной RandSeed, вычисленное с помощью системных часов.
procedure Randomize;
var SystemTime: TSystemTime;
begin
GetSystemTime(SystemTime);
With SystemTime do
RandSeed:=((wHour*60 + wMinute)*60 + wSecond)*1000 + wMilliseconds;
end;
2. Как работает функция Random?
Рассмотрим работу функции для целых чисел.
function Random(Range: integer): integer;
var z: int64;
begin
RandSeed:=RandSeed*$8088405 + 1;
z:=RandSeed;
If z<0 then
z:=z+$100000000;
z:=z*Range;
Result:=z div $100000000;
end;
Согласно этой функции, последовательность чисел зависит от переменной RandSeed. Но, если значение переменной RandSeed будет всегда одинаковым, то мы получим одинаковый набор случайных чисел.
Еще одна особенность заключается в том, что переменная RandSeed всегда изменяется при вызове функции Random, т.е. устанавливает генератор случайного числа на следующее значение.
Напишем эту функцию на ассемблере.
function Random(Range: integer): integer;
asm
MOV EAX,Range
IMUL EDX,RandSeed,$8088405
INC EDX
MOV RandSeed,EDX
MUL EDX
MOV Result,EDX
end;
Рассмотрим работу функции для вещественных (дробных) чисел.
function Random: extended;
const two2neg32 = 1/$100000000; // 2^-32
var z: int64;
begin
RandSeed:=RandSeed*$8088405 + 1;
z:=RandSeed;
If z<0 then
z:=z+$100000000;
Result:=z*two2neg32;
end;
Напишем эту функцию на ассемблере.
function Random: extended;
const two2neg32: double = 1/$100000000; // 2^-32
asm
IMUL EDX,RandSeed,$8088405
INC EDX
MOV RandSeed,EDX
FLD QWORD PTR two2neg32
PUSH $0
PUSH EDX
FILD QWORD PTR [ESP]
ADD ESP,$4
POP EDX
FMULP
FSTP TBYTE PTR Result
end;
Коды получены с помощью Delphi
Похожие статьи
Купить рекламу на сайте за 1000 руб
пишите сюда - alarforum@yandex.ru
Да и по любым другим вопросам пишите на почту
пеллетные котлы
Пеллетный котел Emtas
Наши форумы по программированию:
- Форум Web программирование (веб)
- Delphi форумы
- Форумы C (Си)
- Форум .NET Frameworks (точка нет фреймворки)
- Форум Java (джава)
- Форум низкоуровневое программирование
- Форум VBA (вба)
- Форум OpenGL
- Форум DirectX
- Форум CAD проектирование
- Форум по операционным системам
- Форум Software (Софт)
- Форум Hardware (Компьютерное железо)