我在Haskell做了一些monad的东西,我写了一个函数,根据游戏的决策树计算赢得赌博游戏的概率。它的作用就像一个魅力,除了它有时会返回比预期更轻微的答案。例如,我将我的代码上传到DOMjudge并返回错误,说正确的答案应该是1%6而不是6004799503160661%36028797018963968,这是我的函数返回的。如果你真的进行分工他们几乎都是一样的,但我不明白为什么我的答案仍然略有不同。我一直在搞乱不同的类型(例如使用Real而不是Int),但到目前为止还没有运气。我对这些东西不熟悉,我似乎无法弄清楚这一点。有人能指出我正确的方向吗?
- 已删除代码 -
答案 0 :(得分:4)
由于probabilityOfWinning
中的分割,你的精确度会下降。你有正确的解决方案来避免它 - 使用type Rational = Ratio Integer
---但是你在游戏中应用太晚了。通过在分割后转换toRational
,您在转换为Rational
之前已经失去了精确度。
尝试这样的事情
import Data.Ratio
probabilityOfWinning tree = countWins tree % countGames tree
然后从Real
和countWins
中删除countGames
类型限制,以便它们返回整数而不是浮点数。这些将确保您始终使用无限精度数学而不是浮点数。