ruby - Ruby 中的堆栈级别太深,试图随机抽取一张卡片

标签 ruby stack-level

我在运行下面的代码时遇到错误“堆栈级别太深”。如果随机选择的卡片不在那里,它会选择另一张随机卡片。我想我应该以某种方式碰碰代码,但我不确定如何。有什么建议吗?

   def hit 
    choice_of_card = rand($deck.length); #choose a random card out of the deck
    drawn_card = $deck[choice_of_card]; #draw that random card from the deck
    if drawn_card != 0 #if there is a card there 
     $deck[choice_of_card] = 0; #remove that card from the deck by making the space blank
     if drawn_card == 11 #if you draw an ace
      self.ace_count += 1;
     end 
     self.hand_value += drawn_card ;
    else hit; #if there is no card at that space then redraw (recursion)
    end
  end

最佳答案

正如所写,基于随机数生成器的递归深度是“无限”的。考虑一下什么时候牌组中只剩下一张牌。它将不断选择随机数并递归,直到它最终选择剩下的一张牌;可能有很深的筹码。在 52 张卡片组中剩余一张卡片的情况下,任何一次不选择剩余卡片的几率是 51/52 = 98%。要获得 50% 的机会选择它,您需要大约 35 次迭代/递归。要达到 99% 的选择机会,它需要大约 237 次迭代:(1.0 - (51/52)^237)=99%

要使用这个特定的实现,有必要将其更改为循环(只是迭代而不是递归)。然而,这仍然不是很有效,并且可能会循环很长时间才能找到为数不多的剩余卡片中的一张。另一种方法可能是在牌被移除时从牌组中移除空隙,然后总会有命中。或者也许使用 shuffling algorithm放在前面,然后按顺序遍历它们。

关于ruby - Ruby 中的堆栈级别太深,试图随机抽取一张卡片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12728186/

相关文章:

ruby - 在 Ruby 中访问/处理变量

Ruby - 禁止常量重新定义

javascript - SystemStackError - 堆栈级别太深

Ruby 堆栈级别太深异常不是来自递归无限循环

ruby - 不支持的命令行标志 : --ignore-certificate-errors (in Ruby)

ruby-on-rails - 关于在 ruby​​ on rails 中解析文件的问题

ruby - 使配置可通过整个 ruby​​ gem