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我記不清具體有多少了。。