Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.08.28;
Скачать: CL | DM;

Вниз

Исходник функции random   Найти похожие ветки 

 
Evg12   (2003-08-10 13:02) [0]

Есть у кого random в виде исходника (функции на бумаге).
Очень надо.


 
MBo ©   (2003-08-10 13:05) [1]

В system.pas


 
Evg12   (2003-08-11 00:17) [2]

А вот и нет. Все исходники пресмотрел. Randomize есть а random нет.
Нужна формула генерации случайных чисел. (Копия Random без предварительного Randomize).


 
Pindos ©   (2003-08-11 00:29) [3]

Генерация сл. чисел идёт по сравнению с системным временем, вот и потрудись всякую хрень с сис.Временем поделать, может что-то и выйдет.
И чем тебе нормальное Random & randomize не нравиться?
PindosInc®


 
jack128 ©   (2003-08-11 00:49) [4]

Как я понимаю это
procedure _RandInt;
и
procedure _RandExt;

а собственно Random() встроена в компилятор


 
Marser ©   (2003-08-11 01:06) [5]


> а собственно Random() встроена в компилятор

??

Вроде бы, когда-то random базировался на методе Монте-Карло.


 
Ihor Osov'yak ©   (2003-08-11 01:27) [6]

Кнут, том 2, глава 3. Очень поучительное чтение..

Или все же смотрим system.pas в районe _RandInt и _RandExt

2 Marser © (11.08.03 01:06)

> ??

В зависимости от типа аргумента Random компилятор генерирует вызов или _RandInt или _RandExt.. Так что высказывание jack128 © (11.08.03 00:49) соответствует истине, только уж больно "кучеряво" оно сформулировано..


 
Evg12   (2003-08-11 01:29) [7]

> jack128 ты прав. но они на ассемблере написаны. Не катит.
Исправляю вопрос.

Нужна функция (на паскале) генерящая случайные int числа из указанного предела. Но так, чтоб после инициализации генерила одни и теже последовательности. Тоесть занес в какую-то переменную 0, получил последовательность 5,7,2,4. Занес опять ноль. Опять получил 5,7,2,4.


 
Ihor Osov'yak ©   (2003-08-11 01:47) [8]

Почитай Кнута, и сообразишь примерно такое (здесь предел генерации 0-255)
Если нужен иной предел генерации - то вместо

cod := cod and $0FFFF;
юзай
cod := cod mod aRange; // aRange - предел..

но учти, что aMull, aAdd зависят от aRange - вернее есть некоторые рекомендации по выбору этих чисел в зависимости от aRange - это чтобы генератор был "качественным". Что такое качественный генератор и как выбирать aMull и aAdd - в Кнута не одна страница посвящается


procedure Gen(aInit, aMull, aAdd:word; var Buf; Len : LongWord);
// I am using aMul= 7D17h aAddl=117;
var arr: TByteLongArray absolute Buf;
i: longword;
cod: LongWord;
mask: word;
begin
cod := aInit;
for i := 0 to Len - 1 do begin
cod := cod * aMull + aAdd;
cod := cod and $0FFFF;
mask := cod;
arr[i] := hi(mask);
end;

end;


 
MBo ©   (2003-08-11 08:14) [9]

2 секунды поиска в system.pas по RandSeed

procedure _RandInt;
asm
{ ->EAX Range }
{ <-EAX Result }
IMUL EDX,RandSeed,08088405H
INC EDX
MOV RandSeed,EDX
MUL EDX
MOV EAX,EDX
end;

procedure _RandExt;
const two2neg32: double = ((1.0/$10000) / $10000); // 2^-32
asm
{ FUNCTION _RandExt: Extended; }

IMUL EDX,RandSeed,08088405H
INC EDX
MOV RandSeed,EDX

FLD two2neg32
PUSH 0
PUSH EDX
FILD qword ptr [ESP]
ADD ESP,8
FMULP ST(1), ST(0)
end;


 
DiamondShark ©   (2003-08-11 10:46) [10]


> Вроде бы, когда-то random базировался на методе Монте-Карло.

Не-а. Это метод Монте-Карло когда-то базировался на random. Правда, давно это было. Может с тех пор чего и поменялось.


 
Mr&MsGuns   (2003-08-11 12:33) [11]

"Эскимосы, эскимосы... эскимо едят в морозы... их за это эскимосов... эскимосами зовут..."



Страницы: 1 вся ветка

Текущий архив: 2003.08.28;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.013 c
6-92160
reticon
2003-06-24 16:00
2003.08.28
Список компьютеров в локальной сети


11-92092
_Ed_
2002-12-16 14:28
2003.08.28
Дополнение к OnPaint


8-92121
Blacked
2003-04-15 18:38
2003.08.28
...при наведении на клавишу - звуковой синал???...


3-91996
New laymer
2003-08-06 08:33
2003.08.28
Создания индексного файла.


14-92204
Кен
2003-08-09 06:36
2003.08.28
Нарвался на форум на третьей стадии (это когда форум превращается