2012-01-27 12 views
2

RandomGen -reliant関数のテストのために、私はインスタンス化時に指示する数値を返すRandomGenインスタンスが必要です。これにより、テストされた関数の結果を正しいものと比較することができます。私。 randomへの各呼び出しで、次の番号をリスト[5, 8, 2, 6, 6]から返すようにします(最後に達するとエラーが発生することがあります)。私はその発電機のインスタンスが単にStaticGen [5, 8, 2, 6, 6]として作成されることを期待しています。スタティック(偽)ランダムジェネレータ

私はこのようなライブラリが存在するかどうか、私のテストでは別のアプローチをとるべきかどうか疑問に思っています。

更新時:randomの代わりにnext関数を指定して、質問から間違っていたことがわかりました。リストから値を返すようにしました。謝罪いたします。

+1

例えば。 –

+0

@ダニエルフィッシャーええ、私はそれについて考えましたが、ジェネレータによって実際に返された値は、明らかに私の場合の要件であるコードでは明らかではありませんでした。 –

+0

コードで値を明示する必要がある場合は、実際には機能しません。好奇心から:なぜ彼らは明白でなければならないのですか? –

答えて

5

このようなライブラリを配布することができます。しかし、それは非常に短いでしょう。

newtype StaticGen = StaticGen [Int] 
instance RandomGen StaticGen where 
    next (StaticGen (x:xs)) = (x, StaticGen xs) 
    next _ = error "No more random numbers!" 
    split x = (x, x)   -- broken, but irrelevant 
    genRange _ = (0, maxBound) -- choose your own 

まあ、これはあなたが合格シーケンスをあなたを与えることはありません述べたようにあなたの機能を書き換えるので、代わりにこのような乱数ジェネレータを取ることもできます。

myFunction :: RandomGen g => g -> a -> (b, g) 

彼らが働きます

myFunction :: forall g. (g -> (Int, g)) -> g -> a -> (b, g) 

あなたは乱数ジェネレータでそれを使うことができますこの方法:

の代わりに、このような

それとも、リストでそれを使用することができます。多分StdGen`がニーズに合うか `固定、` staticGen = mkStdGen 13`でテストし、新しい `RandomGen`インスタンスを作成する代わりに

myFunction (\(x:xs) -> (x, xs)) [1,2,3,4] a 
+0

ありがとう!私のインプリでは、 'genRange'と' split'関数の両方を、 'split _ = error" Unsupported "'のようにしました。しかし、私は間違った質問を述べました。私が実際に必要としたのは、 'next'への呼び出しではなく' random'呼び出しが望ましい値を返すジェネレータでした。謝罪いたします。 'System.Random'のソースを解析した後、これを達成するために、対数とループを使って計算された関数randomIvalIntegerの値を元に戻す必要があります。リバースエンジニアリングは悪夢になる可能性があるので、私はすべてがちょうど努力の価値がないと思う。 –

+0

私は自分の答えを更新しましたが、あなたの関数の署名を変更する必要があります。 –

関連する問題