2012-10-04 3 views
1

아래 코드를 실행하는 중에 "스택 레벨이 너무 딥"오류가 발생합니다. 선택한 무작위 카드가없는 경우 다른 무작위 카드를 선택합니다. 어떻게 든 코드를 작성해야 겠지만 확실하지는 않습니다. 어떤 제안?Ruby에서 스택 레벨이 너무 커서 임의의 카드를 그려야합니다

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 
+1

당신은 갑판에서 적어도 하나의 카드가 있는지 확인해야'deck.find {|! C | 무한 루프를 방지하기 위해 [c> 0}' – Baldrick

+1

[Array # shuffle] (http://www.ruby-doc.org/core-1.9.3/Array.html#method-i-sample) 또는 [Array # sample] (http://www.ruby-doc.org/core-1.9.3/Array.html#method-i-shuffle) 코드를 단순화 할 수 있습니다. – steenslag

답변

1

재귀가 오류의 원인이라고 말하는 것이 안전하다고 생각합니다. 당신이 재귀를 필요로하지 않는 날 것으로 보인다, 당신은 단지 루프는 drawn_card 얻을 수있을 때까지 = 0, 예를 들어,

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 
+1

나는 작동하는 것이 오히려 $ deck.delete_at (choice_of_card)를 말하는 것이므로 배열을 줄이면 빈 공간이 생기지 않을 것입니다. –

2

작성된 것처럼 재귀 깊이는 난수 생성기를 기준으로 "무제한"입니다. 카드 하나가 갑판에 남아있을 때를 고려하십시오. 그것은 하나의 카드가 마침내 선택 될 때까지 난수를 선택하고 반복합니다. 잠재적으로 매우 깊은 스택. 한 장의 카드가 52 장의 카드 덱에 남아 있으면 나머지 카드를 한 번 선택하지 않을 확률은 51/52 = 98 %입니다. 50 % 확률로 선택하려면 약 35 회 반복/재귀가 필요합니다. 99 %의 확률을 얻으려면 약 237 회 반복이 필요합니다 : (1.0 - (51/52)^237)=99%.

이 특정 구현을 사용하려면 루프로 변경해야합니다 (재귀보다는 반복). 그러나, 그것은 여전히 ​​매우 효율적이지 않으며 나머지 몇 카드 중 하나를 찾기 전에 오랜 시간 동안 반복 될 수 있습니다. 대안은 카드가 제거되면서 틈에서 틈을 제거하는 것일 수 있습니다. 그리고 나서 항상 명중됩니다. 또는 앞에 shuffling algorithm을 사용하고 순차적으로 반복 할 수 있습니다.

+1

셔플 링 알고리즘 +1. 나는 항상 카드를 위해 그것을 더 잘 찾아 낸다. –

+0

Ruby에서 배열에는 '셔플'[메소드] (http://www.ruby-doc.org/core-1.9.3/Array.html#method-i-shuffle)이 있습니다. – steenslag