Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Клуб программистов > Обсуждение статей
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы
Старый 06.03.2017, 09:17   #1
newerow1989
Я самый любопытный
Профессионал
 
Аватар для newerow1989
 
Регистрация: 24.07.2012
Адрес: RU, Алтайский край, Красногорский р-н, с. Балыкса, ул. Центральная Сообщений: 7,541 Репутация: 37104
Сообщений: 1,722
Репутация: 1539

skype: newerow1989
По умолчанию статья - Генератор случайных чисел. Как образуются случайные числа?

Решил написать статью о том, как работает генератор случайных чисел. С помощью функции 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
__________________
С запрограммированным приветом, Неверов Евгений!
Сайт: http://newerow1989.narod.ru
[Паскаль] [Delphi]

Последний раз редактировалось newerow1989; 06.03.2017 в 09:22.
newerow1989 вне форума   Ответить с цитированием
Старый 06.03.2017, 09:56   #2
Pavia
Лис
Профессионал
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 1,613
Репутация: 1708
По умолчанию

newerow1989
Я бы всё по другому сделал. Меньше чисел больше теории.
Откуда взялось число $8088405? Каким образом оно получается?

Цитата:
Сообщение от newerow1989 Посмотреть сообщение
то мы получим одинаковый набор случайных чисел.
Слово случайный тут лишнее, набор уже неслучайный.
Наверно лучше рассказать как это можно использовать в космических игрушках для генерации случайных планет которые будут разными на разных картах и одинаковые при каждом запуске игры.
__________________
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума   Ответить с цитированием
Старый 06.03.2017, 10:03   #3
newerow1989
Я самый любопытный
Профессионал
 
Аватар для newerow1989
 
Регистрация: 24.07.2012
Адрес: RU, Алтайский край, Красногорский р-н, с. Балыкса, ул. Центральная Сообщений: 7,541 Репутация: 37104
Сообщений: 1,722
Репутация: 1539

skype: newerow1989
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
Откуда взялось число $8088405? Каким образом оно получается?
Взялось из Delphi. Это константа.
Безымянный.png
__________________
С запрограммированным приветом, Неверов Евгений!
Сайт: http://newerow1989.narod.ru
[Паскаль] [Delphi]
newerow1989 вне форума   Ответить с цитированием
Старый 06.03.2017, 10:36   #4
Pavia
Лис
Профессионал
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 1,613
Репутация: 1708
По умолчанию

Константа ПГСЧ подбирается так что-бы последовательность чисел не повторялась по кругу как можно дольше. Процесс подбора и альтернативные варианты описаны у Кнута в книге "Искусство программирования".
__________________
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума   Ответить с цитированием
Старый 07.03.2017, 13:36   #5
kvitaliy
Участник клуба
 
Регистрация: 17.05.2011
Сообщений: 913
Репутация: 1023
По умолчанию

Тогда уж ГПСЧ (Генератор псевдослучайных чисел)
kvitaliy вне форума   Ответить с цитированием
Старый 07.03.2017, 14:47   #6
Arigato
СуперПрограммист
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Адрес: Россия РФ Регистрация: 27.07.2008
Сообщений: 13,616
Репутация: 3609
По умолчанию

Статья опубликована на сайте клуба: Генератор псевдо-случайных чисел (ПСЧ). Как образуются случайные числа?
__________________
E-Mail: arigato.freelance@gmail.com
Arigato на форуме   Ответить с цитированием
Старый 23.04.2017, 14:02   #7
newerow1989
Я самый любопытный
Профессионал
 
Аватар для newerow1989
 
Регистрация: 24.07.2012
Адрес: RU, Алтайский край, Красногорский р-н, с. Балыкса, ул. Центральная Сообщений: 7,541 Репутация: 37104
Сообщений: 1,722
Репутация: 1539

skype: newerow1989
По умолчанию

Здесь тоже кто-то опубликовал: https://newscentral.exsees.com/item/...ff89bdaa5f51bf
__________________
С запрограммированным приветом, Неверов Евгений!
Сайт: http://newerow1989.narod.ru
[Паскаль] [Delphi]
newerow1989 вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
генератор случайных чисел с++ Сергей.Ш Общие вопросы C/C++ 18 25.07.2015 23:09
генератор случайных чисел Nicolas_46 Microsoft Office Excel 9 03.12.2012 14:35
C++ как сделать что бы генератор случайных чисел генерировал, но выводил только одно число RBIT Помощь студентам 3 15.10.2012 22:13
Генератор случайных чисел remont_it, C++ Builder 1 12.05.2012 21:11
Генератор случайных чисел psychopat Общие вопросы Delphi 11 18.02.2009 11:39


10:51.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru