Помощь - Поиск - Пользователи - Календарь
Полная версия: Генерация датчика псевдослучайных чисел
Форум «Всё о Паскале» > Разработка ПО, алгоритмы, общие вопросы > Алгоритмы
Янычар
Помогите пожалуйста разобраться с методом генерации ДСЧ Фибоначчи или иначе его называют Метод Фибоначчи с запаздываниями. Честно говоря информации по данному методу в интернете найти практически не удалось, везде так или иначе цитируют материал из википедии(или наоборот). Там указано две непонятных формулы, непонятных в том смысле что непонятно что они должны делать и главное как) Так что прошу тех, кому известен такой метод не по наслышке рассказать о нем по подробнее, буду очень признателен)
volvo
Ну, почему же только из Википедии? Не только. По крайней мере, на английском языке есть достаточно информации. Начиная отсюда . Там есть описания Multiplicative Lagged Fibonacci Generator и Modified Lagged Fibonacci Generator со ссылками на детальные разборы алгоритмов. Правда, ссылки битые, но по названию статей гуглится на раз-два: вот оно
TarasBer
> Там указано две непонятных формулы, непонятных в том смысле что непонятно что они должны делать и главное как)

На самом деле формула одна:
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 мин.
Метод действительно работает - проверено на научной программе, работающей по методу Монте-Карло. Вычисляемая величина та же, что у немецких конкурентов, но они использовали вообще Вихрь Мерсена (это типа самый крутой генератор). И разброс значений у нас меньше из-за небольшого отличия в методе (не в генераторе).
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.