SIMPLE随机数生成

Jai*_*ina 5 random haskell quickcheck

经过一段令人沮丧的研究后,我正在写这篇文章,我希望这里有人能够启发我这个话题.

我想在haskell函数中生成一个简单的随机数,但是,如果没有各种非平凡的元素,例如Monads,"do"中的asignation,创建生成器等,这似乎是不可能的.

理想情况下,我正在寻找相当于C的"rand()".但经过多次搜索,我很确信没有这样的东西,因为语言是如何设计的.(如果有,请有人赐教).由于这似乎不可行,我想找到一种方法来获取我的特定问题的随机数,以及关于如何获得随机数的一般解释.

prefixGenerator :: (Ord a, Arbitrary a) => Gen ([a],[a])
prefixGenerator = frequency [ 
    (1, return ([],[])),
    (2, do {
            xs1 <- orderedListEj13 ;
            xs2 <- orderedListEj13 ;
            return (xs1,xs2)
       }),
    (2, do {                
            xs2 <- orderedListEj13 ;
            return ((take RANDOMNUMBERHERE xs2),xs2)
       })
    ]
Run Code Online (Sandbox Code Playgroud)

我正试图掌握QuickCheck,但我无法使用随机数字使其变得困难.我试过像这样(通过把一个drawInt 0(长度XS2)替代RANDOMNUMBERHERE),但我卡住与采取需要诠释的事实和方法给我留下了一个IO诠释,这似乎是不可能转变成根据这个.

jbe*_*man 6

由于haskell是一种函数式编程语言,因此函数是引用透明的,这意味着只有函数的参数才能确定其结果.如果你能够从空中拉出一个随机数,你可以想象这会如何导致问题.

我想你需要这样的东西:

prefixGenerator :: (Ord a, Arbitrary a) => Gen ([a],[a])
prefixGenerator = do
  randn <- choose (1,999) -- number in range 1-999
  frequency [ 
    (1, return ([],[])),
    (2, do {
            xs1 <- orderedListEj13 ;
            xs2 <- orderedListEj13 ;
            return (xs1,xs2)
       }),
    (2, do {                
            xs2 <- orderedListEj13 ;
            return ((take randn xs2),xs2)
       })
    ]
Run Code Online (Sandbox Code Playgroud)

通常在haskell中,您可以通过从IO monad中提取一些随机性,或者通过维护使用硬编码的某个整数种子进行初始化的PRNG,或者从IO中提取(gspr的评论非常好)来实现随机数生成.

阅读伪随机数生成器如何工作可能有助于您理解System.Random,也可能有所帮助(向下滚动到随机性部分).