ИМХО, лучшая идея - держать генератор в строгом состоянии .Тогда вы можете использовать обычный do
-Syntax для работы с генератором.Заполнение выполняется только один раз - в начале основной программы (или в начале каждого потока).Вы можете избежать ввода-вывода, используя операцию split
, которая выдает два случайных генератора из одного.(Разное, конечно).
Поскольку состояние все еще чисто, безопасность потоков может быть гарантирована.Кроме того, вы всегда можете выйти из состояния, передав функции случайный генератор.Это полезно, например, в случае автоматических модульных тестов.