stdGen
IO を使用せずに、呼び出しごとに異なる値を返す関数が必要です。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
空の treap を返す関数myStdGen
を呼び出しました。上記の関数を使用して、この treap のランダム ジェネレーターを取得しました。ただし、空の treap が 2 つある場合、それらStdGen
は同じになります。したがって、両方の trap にデータを挿入した後、それらをマージしたい場合、それらのランダム値も同じになります。そのため、頼りにしていたランダム性を失いました。
そのため、呼び出しごとに異なる結果を生成する、何らかの形で「グローバルな」乱数発生器がStdGen
必要なため、空の Treap ごとに異なるStdGen
.