haskell中如何抽取随机数?
随机数(我指的是伪随机数)是由显性或隐性状态产生的。这意味着在Hask::StdG::(随机a)gt(a,a)-gtIOa
在给定范围内随机返回A类型的值,全局生成器将被更新。您可以通过元组指定范围。下面的示例返回一个介于a和z之间的随机值,包括a和z:
clt-randomRIO(阿,中)
可以是任何类型吗?那个这不是真的。在Haskell98标准中,随机库只支持bool、char、int、int::
返回a类型的随机数(a可以是任何类型?见上),全局生成器也会更新。以下示例返回Doubl::IODoubl::IO[float]RandomStuffDonLT-RandomRio(1,7)序列(replicat::国际燃气轮机标准发电机
用随机种子创建一个生成器。
随机::(随机a,随机g)
用生成器生成给定范围的无限列表。示例:使用42作为随机种子,返回一个包含A和Z(从A到Z)的无限列表:
随机数(a,z)(mkStdG::(随机a,随机g)
用给定的生成器生成一个无限的随机数列表。例如,使用42生成一个双精度类型列表作为随机种子:
::[双精度]
随机数的范围由类型决定。需要查文档确定具体范围,或者直接用randomRs。
注意这些都是功能性的——意思是没有副作用,特别是生成器不会更新。如果你用一个生成器生成第一个列表,然后用同一个生成器生成第二个列表…
gmkStdG::[Doubl::[Doubl::randomg::[Float]-gt[[Float]]work(r:RS)letntruncat:workys
除了必要的打印操作之外,这纯粹是功能性的。它用生成器生成一个无限列表,然后用这个无限列表生成另一个无限列表作为答案,最后把第一个作为返回值。
我这样做是因为尽管我们今天的角色会产生一个随机数,但你通常需要很多。希望这个例子能对你有一点帮助。
上面的代码通过使用一个生成器来创建一个包含Float的无限列表。截取第一个值,将这个值展开为1到7,然后使用剩余的列表生成答案。换句话说,把输入列表分成(r:rs),r决定生成列表的长度(1到。7)、答案会在rs之后计算。
::(随机g)gtg-gt(g,g)
用一个随机种子创建两个不同的生成器,否则重用同一个种子是不明智的。
gmkStdGen42(ga,gb)拆分g-不要在其他地方使用g
如果您想要创建两个以上的发生器,可以对其中一个新发生器使用拆分:
gmkStdGen42(ga,g)splitg(gb,gc)splitg-不要在其他地方使用g,g
我们可以用split得到两个生成器,这样就可以生成两个随机列表。
clt-randomRIO(a,z)0
它将生成器一分为二,然后生成两个列表。
我在主程序中硬编码了随机种子。正常情况下,你可以从其他地方获得随机种子——从输入,从文件,从时间,或者从一些设备。
这些都可以在主程序中实现,因为它们可以在IOmonad中访问。
您还可以通过getStdGen获得全局生成器:
clt-随机里奥(a,z)1
【C语言】随机数种子的设置?
这方面我之前了解过一点,不知道能不能帮到你。
我记得函数srand是用来生成一个范围的,应该是从一个标准时间到现在时间的秒的范围。然后rand函数从这个范围中取一个随机值。他的返回值是一个介于0和RAND_MAX之间的随机数,在stdlib.hIdon我记不清具体有多少了。。