gpt4 book ai didi

python - 算术错误: Python is incorrectly dividing variables

转载 作者:行者123 更新时间:2023-11-30 22:33:44 27 4
gpt4 key购买 nike

我得到的东西似乎没有多大意义。我正在通过编写一个小程序来练习编码,该程序可以让我在纸牌游戏的特定时间范围内获得某些纸牌的概率。为了计算机会,我需要创建一个执行除法的方法,并将机会报告为分数和小数。所以我设计了这个:

from fractions import Fraction
def time_odds(card_count,turns,deck_size=60):
chance_of_occurence = float(card_count)/float(deck_size)
opening_hand_odds = 7*chance_of_occurence
turn_odds = (7 + turns)*chance_of_occurence
print ("Chance of it being in the opening hand: %s or %s" %(opening_hand_odds,Fraction(opening_hand_odds)))
print ("Chance of it being acquired by turn %s : %s or %s" %(turns,turn_odds,Fraction(turn_odds) ))

然后我像这样使用它:

time_odds(3,5)

但无论出于何种原因,我得到了这个答案:

"Chance of it being in the opening hand: 0.35000000000000003 or 
6305039478318695/18014398509481984"
"Chance of it being acquired by turn 5 : 0.6000000000000001 or
1351079888211149/2251799813685248"

所以,几乎是正确的,只是小数点稍有偏差,大约有 0.0000000000003 差异或 0.000000000000000000001 差异。

当我让它像这样进行除法时,Python 不会这样做:

print (7*3/60)

这给了我 0.35,这是正确的。我可以观察到的唯一区别是,当我除以变量而不仅仅是数字时,我得到的值稍微不正确。

我环顾四周寻找答案,大多数不正确的除法问题都与整数除法有关(或者我认为它可以称为地板除法),但我没有找到任何解决这个问题的方法。

当我除以非常大的数字时,我也遇到了类似的问题。这是怎么回事?

为什么会这样呢?我该怎么做才能纠正它?

最佳答案

您看到的额外数字是浮点精度错误。随着您对 float 进行越来越多的运算,错误有可能会复合。

当您尝试手动复制计算时看不到它们的原因是您的复制以不同的顺序执行操作。如果您计算 7 * 3/60,乘法首先发生(没有错误),除法会引入一个足够小的错误,Python 的 float 类型会为您隐藏它它的 repr (因为 0.35 明确指代与计算相同的浮点值)。如果您执行 7 * (3/60),则首先进行除法(引入错误),然后乘法将错误的大小增加到无法隐藏的程度(因为 0.35000000000000003 是与 0.35 不同的浮点值。

为了避免打印出可能出错的额外数字,您可能需要明确指定将数字转换为字符串时使用的精度。例如,您可以使用 %.3f,而不是使用 %s 格式代码(对值调用 str),这将将数字四舍五入到小数点后三位。

您的分数还有另一个问题。您直接从浮点值创建分数,该浮点值已经计算出了误差。这就是为什么您看到分数打印出来时带有一个非常大的分子和分母(它准确地代表了与不准确的 float 相同的数字)。如果您将整数分子和分母值传递给 Fraction 构造函数,它将负责为您简化分数,而不会出现任何浮点不准确:

print("Chance of it being in the opening hand: %.3f or %s" 
% (opening_hand_odds, Fraction(7*card_count, deck_size)))

这应该打印出数字 0.3507/20。您当然可以选择您想要的任何小数位数。

与浮点误差完全分开,计算实际上并没有得到正确的概率。您使用的公式可能足够适合您在玩游戏时在头脑中计算,但它并不完全准确。如果您使用计算机来计算数字,那么您不妨做对。

D抽牌后,从一副尺寸为M的牌中抽出至少一张N特定牌的概率为:

1 - (comb(M-N, D) / comb(M, D))

其中comb是二元系数或“组合”函数(在数学中通常读作“N选R”,写作“nCr”)。 Python 在标准库中没有该函数的实现,但是您可能已经安装了许多附加模块来提供该函数,或者您可以很容易地编写自己的函数。请参阅this earlier question了解更多详情。

对于您的示例参数,正确的赔率是“5397/17110”或0.315

关于python - 算术错误: Python is incorrectly dividing variables,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45071158/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com