IPB
ЛогинПароль:

 
 Ответить  Открыть новую тему 
> Генерация датчика псевдослучайных чисел
Янычар
сообщение 25.11.2010 20:38
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 115
Пол: Мужской
Реальное имя: Александр

Репутация: -  1  +


Помогите пожалуйста разобраться с методом генерации ДСЧ Фибоначчи или иначе его называют Метод Фибоначчи с запаздываниями. Честно говоря информации по данному методу в интернете найти практически не удалось, везде так или иначе цитируют материал из википедии(или наоборот). Там указано две непонятных формулы, непонятных в том смысле что непонятно что они должны делать и главное как) Так что прошу тех, кому известен такой метод не по наслышке рассказать о нем по подробнее, буду очень признателен)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 25.11.2010 21:42
Сообщение #2


Гость






Ну, почему же только из Википедии? Не только. По крайней мере, на английском языке есть достаточно информации. Начиная отсюда . Там есть описания Multiplicative Lagged Fibonacci Generator и Modified Lagged Fibonacci Generator со ссылками на детальные разборы алгоритмов. Правда, ссылки битые, но по названию статей гуглится на раз-два: вот оно
 К началу страницы 
+ Ответить 
TarasBer
сообщение 26.11.2010 11:05
Сообщение #3


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


> Там указано две непонятных формулы, непонятных в том смысле что непонятно что они должны делать и главное как)

На самом деле формула одна:
a[i] = frac(a[i-97]-a[i-33]);
То есть простой ряд Фибоначчи, но берётся только дробная часть.

> При реализации через целые числа достаточно формулы Xk = X[k − a] − X[k − b] (при этом будут происходить арифметические переполнения).

(это моя правка, кстати)
Для реализации на компе надо вместо бесконечной последовательности взять конечную, но циклическую.


{$R-}
const
FibCount = 1 shl 7;
a = 97;
b = 33;
var
N: integer;
Fibs: array [0 .. FibCount - 1] of cardinal;

function Random: cardinal;
begin
Fibs[N] := Fibs[(N - a) and (FibCount - 1)] - Fibs[(N - b) and (FibCount - 1)]
Result := Fibs[N];
N := (N + 1) and (FibCount - 1);
end;

procedure Randomize;
var
i: integer;
begin
Fibs[0] := GetTickCount;
for i := 1 to FibCount - 1 do
Fibs[i] := Fibs[i - 1] * 1664525 + 1013904223;
end;




Добавлено через 2 мин.
Метод действительно работает - проверено на научной программе, работающей по методу Монте-Карло. Вычисляемая величина та же, что у немецких конкурентов, но они использовали вообще Вихрь Мерсена (это типа самый крутой генератор). И разброс значений у нас меньше из-за небольшого отличия в методе (не в генераторе).


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 10.11.2024 17:27
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"