擲骰子公式(非蠻力)
首先,我不確定應該在哪裡發布這個問題。我在問一個統計問題是否是 NP 完全的,如果不是以編程方式解決它。我在這裡發布它是因為統計問題是中心點。
我試圖找到一個更好的公式來解決問題。問題是:如果我有 4d6(4 個普通的 6 面骰子)並一次擲出所有骰子,取出一個數量最少的骰子(稱為“掉落”),然後將剩餘的 3 個相加,每個可能結果的概率是多少? 我知道答案是這樣的:
Sum (Frequency): Probability 3 (1): 0.0007716049 4 (4): 0.0030864198 5 (10): 0.0077160494 6 (21): 0.0162037037 7 (38): 0.0293209877 8 (62): 0.0478395062 9 (91): 0.0702160494 10 (122): 0.0941358025 11 (148): 0.1141975309 12 (167): 0.1288580247 13 (172): 0.1327160494 14 (160): 0.1234567901 15 (131): 0.1010802469 16 (94): 0.0725308642 17 (54): 0.0416666667 18 (21): 0.0162037037
平均值為 12.24,標準差為 2.847。
我通過蠻力找到了上述答案,但不知道如何或是否有公式。我懷疑這個問題是NP-Complete,因此只能通過蠻力解決。有可能獲得 3d6 的所有概率(3 個正常的 6 面骰子),然後將它們中的每一個向上傾斜。這將比蠻力更快,因為當所有骰子都被保留時,我有一個快速的公式。
我編寫了在大學裡保留所有骰子的公式。我曾問過我的統計學教授,他找到了這個頁面,然後他向我解釋了這個頁面。這個公式和蠻力之間有很大的性能差異:50d6 花了 20 秒,但 8d6 在 40 秒後下降了最低崩潰(chrome 耗盡內存)。
這個問題是NP完全的嗎? 如果是,請提供證明,如果不是,請提供一個非暴力公式來解決它。
請注意,我對 NP-Complete 了解不多,所以我可能會考慮 NP、NP-Hard 或其他東西。NP-Completeness 的證明對我來說毫無用處,我要求它的唯一原因是為了防止人們猜測。請告訴我,因為我已經很長時間沒有做這個了:我不記得統計數據,因為我可能需要解決這個問題。
理想情況下,我正在尋找一個更通用的公式,用於當 N 個骰子被丟棄時 X 個帶有 Y 面的骰子,但我從更簡單的東西開始。
編輯:
我也更喜歡公式來輸出頻率,但只輸出概率是可以接受的。
對於那些感興趣的人,我已經在我的 GitHub 上用 JavaScript 編寫了 whuber 的答案(在這個提交中,只有測試實際使用了定義的函數)。
解決方案
讓有骰子每個給結果的機會均等. 讓是所有值中的最小值骰子是獨立投擲的。
考慮所有總和的分佈值條件. 讓是這個總和。形成任何給定值的方法數量的生成函數, 假設最小值至少為, 是
由於骰子是獨立的,因此形成值的方式數的生成函數哪裡都有骰子顯示的值或更大是
該生成函數包括以下事件的術語超過,所以我們需要減去它們。因此,生成函數為形成值的方式數, 給定, 是
注意到總和最大值是所有值減去最小值的總和,等於. 因此生成函數需要除以. 在乘以任何骰子組合的常見概率時,它成為概率生成函數,:
由於所有多項式乘積和冪都可以在運算(它們是卷積,因此可以使用離散的快速傅里葉變換來執行),總計算量為. 特別是,它是一種多項式時間算法。
例子
讓我們通過問題中的示例來解決和.
公式對於 PGF有條件的給
將他們提升到公式中的功率生產
他們在公式上的連續差異是
公式中的結果總和是
例如,前三個骰子總和的機會是係數, 等於
它與問題中引用的概率完全一致。
順便說一句,平均值(根據這個結果計算)是標準差是.
一個類似的(未優化的)計算骰子而不是不到半秒,支持了這不是一個計算要求高的算法的論點。這是分佈的主要部分的圖:
由於最低很可能等於和總和將非常接近正常分佈(其均值是標準差約為),均值必須非常接近並且標準差非常接近. 這很好地描述了情節,表明它可能是正確的。事實上,精確的計算給出了大約比…更棒和一個標準差少於.