Haskell中的随机数发生器

Haskell中的随机数发生器,haskell,random,Haskell,Random,我试图在HaskellmkStdGen中生成10个随机数,范围为0(包括)到100(不包括) 以下Java代码的等价物 Random ran = new Random(); ran.nextInt(100); 注意,我必须使用mkStdGen 这就是我目前所拥有的 rand low high seed=fst(随机数(低,高)(mkStdGen seed)) 随机列表::Int->Int->Int->[Int] randomlist l h num=take num(映射(rand l h)

我试图在Haskell
mkStdGen
中生成10个随机数,范围为0(包括)到100(不包括)

以下Java代码的等价物

Random ran = new Random();
ran.nextInt(100);
注意,我必须使用
mkStdGen

这就是我目前所拥有的

rand low high seed=fst(随机数(低,高)(mkStdGen seed))
随机列表::Int->Int->Int->[Int]
randomlist l h num=take num(映射(rand l h)[0..]

请注意,这并不是真正的伪随机,因为
mkStdGen
采用显式种子<如果允许您在
IO
中运行,code>newStdGen会更好


请注意,这并不是真正的伪随机,因为
mkStdGen
采用显式种子
newStdGen
会更好,如果允许您在
IO
中运行,这是家庭作业吗?你能告诉我们到目前为止你得到了什么代码吗?接下来(mkstdgen3)是我到目前为止得到的,我还在阅读文档。但是有一个特定的代码片段可以运行。nextInt(100)会使事情更容易理解…大多数haskell文档不喜欢给出具体的例子这是家庭作业吗?你能告诉我们到目前为止你得到了什么代码吗?接下来(mkstdgen3)是我到目前为止得到的,我还在阅读文档。但是有一个特定的代码片段可以运行。nextInt(100)会使事情更容易理解……大多数haskell文档不喜欢给出具体的例子。好吧,它在任何情况下都不是随机的,它总是一个PRNG。如果您以不纯语言的相同方式获得种子(例如,从
/dev/urand
读取Java默认执行的任何操作),这与Java示例一样是伪随机的。True;我将编辑它,说它甚至不是真正的伪随机。我建议重构为
pseudoRandoms::StdGen->Int->[Int]
,将生成器和绑定作为参数传递,然后您可以以任何可用的方式获得生成器,
mkStdGen
newStdGen
并以纯粹的方式使用它,即使它来自IO。在末尾附加一个
take k
可以让用户毫无问题地完成。@dave4420啊,我找到了解决方案。不管怎么说,这都要归功于你,根据最合理的伪随机定义,它是伪随机的。正如维基百科中所说,“序列不是真正随机的,因为它完全由一组相对较小的初始值决定”,准确地描述了您的代码。()好吧,无论如何它都不是随机的,它总是一个PRNG。如果您以不纯语言的相同方式获得种子(例如,从
/dev/urand
读取Java默认执行的任何操作),这与Java示例一样是伪随机的。True;我将编辑它,说它甚至不是真正的伪随机。我建议重构为
pseudoRandoms::StdGen->Int->[Int]
,将生成器和绑定作为参数传递,然后您可以以任何可用的方式获得生成器,
mkStdGen
newStdGen
并以纯粹的方式使用它,即使它来自IO。在末尾附加一个
take k
可以让用户毫无问题地完成。@dave4420啊,我找到了解决方案。不管怎么说,这都要归功于你,根据最合理的伪随机定义,它是伪随机的。正如维基百科中所说,“序列不是真正随机的,因为它完全由一组相对较小的初始值决定”,准确地描述了您的代码。()
import System.Random

tenPseudorandomNumbers :: Int -> [Int]
tenPseudorandomNumbers seed = take 10 . randomRs (0, 99) . mkStdGen $ seed