iskander писал(а):А зачем тогда эта лишняя сущность - генератор?
Ты же сам и ответил, зачем — хранить состояние. Такие генераторы может создавать, и удерживать нужное время, каждый, кому они нужны — например, если мы выносим работу в поток, её персональный генератор можно держать в поле соответствующего наследника TThread.
>инициализировать чем похожим на элементы случайной последовательностиНе обязательно, принято делать так, чтобы получались независимые генераторы при инициализации любыми разными числами, хоть 0, 1, 2. Поэтому обычно инициализируют наносекундным временем — оно де-факто всегда меняется между 2 вызовами и очень нескоро повторится. Можно xor'нуть его с uint64(ThreadID) shl 32. :)
Есть другой вариант (я прочитал о нём у автора Xo(ro)shiro) — явно разделить весь период генератора на части. Многие генераторы предоставляют возможность прыгнуть вперёд на большое расстояние — у меня это методы .Jump. Можно начать с одного генератора и раздавать его версию, пропрыгнутую на разные расстояния.
Например, для выполнения 1000 параллельных единиц работы можно взять 1 состояние генератора Xoshiro128**/32 (период = 2^128) за начальное, и раздавать его версии, пропрыгнутые на 2^96:
- Код: Выделить всё
var
state: Xoshiro128ss_32;
workerStates: array[0 .. 999] of Xoshiro128ss_32;
i: SizeInt;
begin
state.Setup(0);
for i := 0 to High(workerStates) do
begin
state.Jump(state.Poly2p96);
workerStates[i] := state;
end;
end;
Эти генераторы гарантированно выдадут последовательности 2^96 чисел, непересекающиеся с другими. Таких генераторов можно получить 2^32 штук (4 миллиарда), прежде чем пропрыгается весь период (2^96 × 2^32 = 2^128). По аналогии можно прыгать на 2^64 и получить до 2^64 гарантированно непересекающихся последовательностей этой длины.
Если количество требуемых состояний заранее неизвестно, можно прыгать на золотое сечение от периода — у меня это GoldenJump или PolyGolden. Не знаю математики, по которой это работает (там что-то с иррациональностью и рациональными приближениями), но оно реально будет делить весь период генератора на примерно равные, всё уменьшающиеся части.