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

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

隨機數生成器過于頻繁地重復某些數字

隨機數生成器過于頻繁地重復某些數字

Go
慕妹3146593 2021-12-07 17:06:50
我正在編寫一個彩票開獎模擬程序作為一個項目。游戲的運作方式是您需要從 49 中選出 6 個號碼才能獲勝。您獲勝的機會是 1/13,983,816,因為這是 49 種組合中有 6 種組合。將demo program on Go playground產生圍繞循環下去,每次六個新的號碼。每次生成一組新數字時,我都會測試它是否已經存在,如果存在,我會跳出循環。對于 13,983,816 種組合,您會認為需要很長時間才能重復相同的 6 個數字,但是在測試中它總是在 10000 次迭代之前失敗。有誰知道為什么會這樣?
查看完整描述

3 回答

?
慕絲7291255

TA貢獻1859條經驗 獲得超6個贊

在我看來,你在這里有幾個問題。

  1. 您使用 Go 游樂場,在那里您的隨機性是固定的。這條線rand.Seed(time.Now().UnixNano())總是產生相同的種子,因為time.Now()是相同的。

  2. 你用你的模擬測試完全不同的東西。我會在最后寫下它。

  3. 如果你想做一些類似于賭博的事情——你必須使用加密安全的 PRNG并且Go 擁有它。如果您愿意,可以在此處閱讀更多詳細信息(答案是 php 問題,但它解釋了區別)。


在概率部分:

中獎的概率確實是1/C(49, 6) = 1/13,983,816。但這是某人選擇一組已經預定義的數字的概率。例如,您聲稱您的獲勝者是{1, 5, 47, 3, 4, 5},現在某人獲勝的概率約為 1400 萬分之一。因此,您必須執行以下操作。隨機選擇一組 6 個數字,然后將循環中的新選擇與已找到的數字進行比較。

但是你要做的是檢查碰撞的概率。有 N 個人,他們中的一些人會選擇相同的集合(甚至不一定是獲勝的集合)。這就是著名的生日悖論。正如你在那里看到的,碰撞的概率隨著人數 N 的增加而急劇增加。

這絕對是相同的問題,但是您一年中的天數是13,983,816,您可以在此處檢查,對于這個天數,您只需要 5000 次迭代即可保證 0.59% 會發生碰撞。通過 9000 次迭代,您會發現碰撞概率為 0.94。


查看完整回答
反對 回復 2021-12-07
?
隔江千里

TA貢獻1906條經驗 獲得超10個贊

我相信您正在解決一個不同的問題,出現兩個相同抽獎的可能性比出現一個特定抽獎的可能性要高得多。



查看完整回答
反對 回復 2021-12-07
?
精慕HU

TA貢獻1845條經驗 獲得超8個贊

順便說一句,生日悖論的粗略經驗法則是,如果您有 N 天,則需要迂回的 sqrt(N) 個人來獲得良好的碰撞機會(大約 50%)。

所以,對于最初的生日悖論,你有 365 天,所以經驗法則告訴你,如果有 365^.5 或大約 19 個人,你就有可能發生碰撞(>50% 的正確答案:23 個人)。

在這里,有 13,983,816 種可能的結果,經驗法則告訴您,3739 次平局,您很有可能發生碰撞(50% 的正確答案:4400 次平局)。


查看完整回答
反對 回復 2021-12-07
  • 3 回答
  • 0 關注
  • 302 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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