我為生日問題定義了一個非常簡單的函式:
from math import comb, factorial
import numpy as np
def birthday(k):
return 1-((factorial(k)*comb(365,k))/(365**k))
該函式有效,因為k=23給出:
[in] birthday(23)
[out] 0.5072972343239854
我想遍歷一個k從 1 到 50 的串列prob,并將概率結果保存到一個串列中,如下所示:
klist=np.arange(1,51)
prob=[]
for k in klist:
prob.append(birthday(k))
對于 k=1 到 k=7,沒有問題,但是k=8從那時起,輸出突然變得不再有意義,并且具有非常大的負值。我在這里做錯了什么?(顯示 k=1 到 10 的輸出)
[ 1 2 3 4 5 6 7 8 9 10 ]
[0.0, 0.002739726027397249, 0.008204165884781345, 0.016355912466550326, 0.02713557369979358, 0.040462483649111536, 0.056235703095975365, -203.08817475498518, -20769.916905383445, -11786425.811859423]
但是,只需運行:
[in] birthday(10)
給出正確的:
[out] 0.11694817771107768
uj5u.com熱心網友回復:
問題是在某種程度上使用這個:
klist=np.arange(1,51)
這使得 knumpy.int32對于每次呼叫birthday。如果你試試這個:
print(birthday(np.int32(10)))
你會發現它有同樣的問題。
這雖然有效:
from math import comb, factorial
import numpy as np
def birthday(k):
return 1-((factorial(k)*comb(365,k))/(365**k))
prob=[]
for k in range(51):
prob.append(birthday(k))
一個 32 位整數似乎不足以容納birthday()計算的值,而且它看起來會溢位。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/401103.html
