亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在整個范圍內一致生成隨機數

在整個范圍內一致生成隨機數

C++
神不在的星期二 2019-06-25 17:18:13
在整個范圍內一致生成隨機數我需要在指定的間隔內生成隨機數,[max;min]。另外,隨機數應該均勻地分布在區間上,而不是位于特定的點上。目前,我正在以下列方式產生:for(int i=0; i<6; i++){     DWORD random = rand()%(max-min+1) + min;}從我的測試中,隨機數只產生在一個點左右。Examplemin = 3604607;max = 7654607;產生的隨機數:363159436092933630000362844136363763621404從下面得到的答案:好的,RANDMAX是32767。我在C+Windows平臺上。還有其他方法來生成均勻分布的隨機數嗎?
查看完整描述

3 回答

?
函數式編程

TA貢獻1807條經驗 獲得超9個贊

警告:不要使用rand()統計,模擬,密碼學或任何嚴肅的東西。

足夠做數字了對于一個典型的匆忙中的人來說是隨機的,不再是了。

看見@Jefffrey的答復為更好的選擇,或這個答案密碼安全的隨機數。


一般來說,高比特比低比特顯示出更好的分布,因此為了簡單的目的,建議生成一個范圍的隨機數的方法是:

((double) rand() / (RAND_MAX+1)) * (max-min+1) + min

確保RAND_MAX+1不溢出(謝謝Demi)!

該除法在間隔[0,1]中生成一個隨機數;將其“拉伸”到所需的范圍。只有當max-min+1接近RAND_MAX時,您才需要一個“bigRand()”函數,就像MarkRansson發布的那樣。

這也避免了一些切片問題,因為模塊化,這會使你的數字更加惡化。


內置的隨機數發生器不能保證具有統計模擬所需的質量。對人來說,數字“看起來是隨機的”是可以的,但是對于一個嚴肅的應用程序,您應該采取更好的方法-或者至少檢查它的性質(均勻分布通常是好的,但是值往往是相關的,并且序列是確定性的)。Knuth有一篇關于隨機數產生器的優秀論文(如果難讀的話),我最近發現。LFSR要做到優秀且易于實現,考慮到它的屬性對您來說是可以的。


查看完整回答
反對 回復 2019-06-25
  • 3 回答
  • 0 關注
  • 626 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號