Stack level too deep in Ruby trying to draw a random card

前端 未结 2 688
南旧
南旧 2021-01-25 16:54

I\'m getting an error \"stack level too deep\" running the code below. If the random card picked is not there it picks another random card. I suppose I should chance the code so

相关标签:
2条回答
  • 2021-01-25 17:45

    As written, the recursion depth is "unlimited" based on the random number generator. Consider when there is only one card left in the deck. It will keep choosing random numbers and recursing until it finally picks the one card left; a very deep stack potentially. With one card remaining in a 52 card deck, the odds of not selecting the remaining card any one time is 51/52=98%. To get to a 50% chance of selecting it, you need about 35 iterations/recursions. To reach a 99% chance of selecting it, it needs about 237 iterations: (1.0 - (51/52)^237)=99%.

    To use this particular implementation, it would be necessary to change it to a loop (just iterate rather than recurse). However, that is still not very efficient and could loop a long time before finding one of the few remaining cards. An alternative might be to remove the gaps from the deck as cards are removed and then there will always be a hit. Or maybe use a shuffling algorithm up front and then just iterate through them sequentially.

    0 讨论(0)
  • 2021-01-25 17:59

    I think it's safe to say the recursion is causing the error. Seems to me you don't need recursion, you could just loop until you get drawn_card != 0, e.g.,

    drawn_card = 0
    while drawn_card == 0
      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
    end
    
    0 讨论(0)
提交回复
热议问题