Текущий архив: 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