Я хочу иметь функцию, которая возвращает разные stdGen
в каждом вызове без ввода-вывода. Я пытался использовать unsafePerformIO
в качестве следующего кода.
import System.IO.Unsafe
import System.Random
myStdGen :: StdGen
myStdGen = unsafePerformIO getStdGen
Но когда я пытаюсь вызвать myStdGen
в ghci, я всегда получаю одно и то же значение. Я злоупотреблял unsafePerformIO
? Или есть другие способы достичь моей цели?
ИЗМЕНИТЬ Извините, я думаю, что должен более точно описать свой вопрос.
На самом деле, я реализую вариант структуры данных treap, для которого требуется специальная операция «слияния». Он полагается на некоторую случайность, чтобы гарантировать амортизированную O (log n) ожидаемую временную сложность.
Я пытался использовать такую пару, как (Tree, StdGen)
, чтобы сохранить генератор случайных чисел для каждого набора. При вставке новых данных в treap я бы использовал random
, чтобы присвоить случайное значение новому узлу, а затем обновить свой генератор. Но я столкнулся с проблемой. У меня есть функция с именем empty
, которая возвращает пустой набор, и я использовал функцию myStdGen
выше, чтобы получить генератор случайных чисел для этого набора. Однако, если у меня есть два пустых трепа, их StdGen
будет одинаковым. Поэтому после того, как я вставил данные как в treap, так и когда я хочу их объединить, их случайное значение тоже будет одинаковым. Поэтому я потерял случайность, на которую полагаюсь.
Вот почему я хотел бы иметь какой-то «глобальный» генератор случайных чисел, который выдает разные StdGen
для каждого вызова, чтобы каждый пустой треп мог иметь разные StdGen
.