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