为什么我的递归函数总是使用相同的随机数?

时间:2015-02-12 13:30:05

标签: ruby

我正在尝试写一些模拟鞅赌博系统的东西。如果你不熟悉这个,那就是“肯定的事!” (不是肯定的)投币系统用于掷硬币游戏,每次输掉时你都会加倍投注,希望在第一场胜利时赢回所有损失的金钱。

所以你的赌注将是10美元 - >损失 - > 20美元 - >损失 - > 40美元 - >损失 - > 80美元 - >赢得! - > $ 10 ...

简单,对吧?我认为逻辑将是:

  1. 拥有一个起价为1,000美元的钱包变量。
  2. 下注。
  3. rand(0..1)翻转硬币。 0将是一个损失,1是一个胜利。
  4. 如果我赢了,请将赌注添加到我的钱包中。如果我输了,从我的钱包中减去赌注,然后再发一次新赌注。
  5. 我把它写成:

    def flip(bet)
        if rand(0..1) == 0 then
            $balance += bet
        else
            $balance -= bet
            flip(bet*2)
        end
    end
    

    然后我运行flip(10)一千次,看看这个投注系统的效果如何。

    问题是我总能得到完全相同的结果。我将运行该程序十次,前五个结果将始终是1010,1020,1030,1040,1050 ...所以有些不对劲。但我真的看不出来;逻辑对我来说似乎很好。

    为了测试一下,我删除了递归调用,即行flip(bet*2)。相反,我只是进行了一千次定期投注。这表现得像你期望的那样,每次都有不同的结果。

    那么这里发生了什么?

2 个答案:

答案 0 :(得分:3)

看着逻辑,看起来它会递归下注,直到你赢了。因此看起来你的平衡每次都会增加10,因此“1010,1020,1030,1040,1050”。

如果您在puts $balance行之前放置flip(bet*2),则可以看到余额上下移动。

我猜这就是投注系统的重点。我不认为该方法的随机部分有任何问题。

答案 1 :(得分:2)

您的结果正是您所期望的"确定的事情"投注,因为你允许$balance变为负数,所以更好的不受任何限制(实际上它们拥有无限的资源)。该策略将在最后一笔余额中退出10美元,原因是10,20,40美元,然后加80.因为你允许负余额,更好的是允许继续这 - 虽然模型可以注意到他们连续输掉6场比赛(64次机会中有1场),然后他们会失败至370美元,并且无法以640美元进行下一次下注。

添加一些东西以防止资金耗尽,你应该看到在发生这种情况之前需要多少赌注,或$balance的失败价值是多少(即你可以通过这种方式证明"确定的事情"战略是有缺陷的 - 因为每10美元的63胜,就会有630美元的损失以完美平衡它。)