haskell中如何抽取隨機數(shù)?
隨機數(shù)(我指的是偽隨機數(shù))是由顯性或隱性狀態(tài)產(chǎn)生的。這意味著在Hask::StdG::(隨機a)gt(a,a)-gtIOa
在給定范圍內(nèi)隨機返回A類型的值,全局生成器將被更新。您可以通過元組指定范圍。下面的示例返回一個介于a和z之間的隨機值,包括a和z:
clt-randomRIO(阿,中)
可以是任何類型嗎?那個這不是真的。在Haskell98標(biāo)準(zhǔn)中,隨機庫只支持bool、char、int、int::
返回a類型的隨機數(shù)(a可以是任何類型?見上),全局生成器也會更新。以下示例返回Doubl::IODoubl::IO[float]RandomStuffDonLT-RandomRio(1,7)序列(replicat::國際燃氣輪機標(biāo)準(zhǔn)發(fā)電機
用隨機種子創(chuàng)建一個生成器。
隨機::(隨機a,隨機g)
用生成器生成給定范圍的無限列表。示例:使用42作為隨機種子,返回一個包含A和Z(從A到Z)的無限列表:
隨機數(shù)(a,z)(mkStdG::(隨機a,隨機g)
用給定的生成器生成一個無限的隨機數(shù)列表。例如,使用42生成一個雙精度類型列表作為隨機種子:
::[雙精度]
隨機數(shù)的范圍由類型決定。需要查文檔確定具體范圍,或者直接用randomRs。
注意這些都是功能性的——意思是沒有副作用,特別是生成器不會更新。如果你用一個生成器生成第一個列表,然后用同一個生成器生成第二個列表…
gmkStdG::[Doubl::[Doubl::randomg::[Float]-gt[[Float]]work(r:RS)letntruncat:workys
除了必要的打印操作之外,這純粹是功能性的。它用生成器生成一個無限列表,然后用這個無限列表生成另一個無限列表作為答案,最后把第一個作為返回值。
我這樣做是因為盡管我們今天的角色會產(chǎn)生一個隨機數(shù),但你通常需要很多。希望這個例子能對你有一點幫助。
上面的代碼通過使用一個生成器來創(chuàng)建一個包含F(xiàn)loat的無限列表。截取第一個值,將這個值展開為1到7,然后使用剩余的列表生成答案。換句話說,把輸入列表分成(r:rs),r決定生成列表的長度(1到。7)、答案會在rs之后計算。
::(隨機g)gtg-gt(g,g)
用一個隨機種子創(chuàng)建兩個不同的生成器,否則重用同一個種子是不明智的。
gmkStdGen42(ga,gb)拆分g-不要在其他地方使用g
如果您想要創(chuàng)建兩個以上的發(fā)生器,可以對其中一個新發(fā)生器使用拆分:
gmkStdGen42(ga,g)splitg(gb,gc)splitg-不要在其他地方使用g,g
我們可以用split得到兩個生成器,這樣就可以生成兩個隨機列表。
clt-randomRIO(a,z)0
它將生成器一分為二,然后生成兩個列表。
我在主程序中硬編碼了隨機種子。正常情況下,你可以從其他地方獲得隨機種子——從輸入,從文件,從時間,或者從一些設(shè)備。
這些都可以在主程序中實現(xiàn),因為它們可以在IOmonad中訪問。
您還可以通過getStdGen獲得全局生成器:
clt-隨機里奧(a,z)1
【C語言】隨機數(shù)種子的設(shè)置?
這方面我之前了解過一點,不知道能不能幫到你。
我記得函數(shù)srand是用來生成一個范圍的,應(yīng)該是從一個標(biāo)準(zhǔn)時間到現(xiàn)在時間的秒的范圍。然后rand函數(shù)從這個范圍中取一個隨機值。他的返回值是一個介于0和RAND_MAX之間的隨機數(shù),在stdlib.hIdon我記不清具體有多少了。。
