Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.009 c
14-92229
Proger_XP
2003-08-09 10:46
2003.08.28
Программы


3-92045
Алексей Петухов
2003-08-04 13:52
2003.08.28
Индекс в TQuery


11-92089
Y
2002-12-22 18:07
2003.08.28
Создание таблицы рекордов


14-92174
MalkoLinge
2003-08-11 14:15
2003.08.28
Я вышел на новую работу !!


3-92046
dmtr
2003-08-02 13:00
2003.08.28
Обновление нескольких таблиц одним SQL-запросом




   Наверх