2013-10-04 4 views
1

6 면체 주사위를 1000 번 굴려서 주사위 숫자가 굴린 횟수를 반환해야하는 코드에 문제가 있습니다.파이썬 주사위 굴림 시뮬레이션

코드가 잘 실행되고 끝에 목록을 가져올 수 있지만 내 목록에 4가 0으로 유지되므로 내 기능이 롤백중인 숫자 4에 탭을 유지하지 못하거나 롤백되지 않는 것으로 보입니다. 조금도.

나는 다소 혼란스럽고 여기 누군가가 도울 수 있다고 생각했습니다. 모든 도움을 주시면 감사하겠습니다.

여기 내 코드가 있습니다.

def rollDie(number): 
    one = 0 
    two = 0 
    three = 0 
    four = 0 
    five = 0 
    six = 0 
    for i in range(0, number): 
     roll=int(random.randint(1,6)) 
     if roll == 1: 
      one = one+1 
     elif roll == 2: 
      two = two+1 
     elif roll == 3: 
      three = three+1 
     elif roll == 4: 
      four == four+1 
     elif roll == 5: 
      five = five+1 
     elif roll == 6: 
      six = six+1 
    return [one,two,three,four,five,six] 

답변

8

당신은 작은 오타가 있습니다. 당신은 할당되지 어떤지를 판정하는 :

four == four+1 

은 다음과 같아야합니다

four = four+1 

그러나, 이미 왜 결과 목록의 인덱스에 해당하지, 1과 6 사이의 숫자가? 그런 식으로 많은 문을 사용하지 않아도됩니다. 당신의 변수 이름에서 데이터를 유지 : 당신은 random.randint(1, 7)을 수행해야

def rollDie(number): 
    counts = [0] * 6 
    for i in range(number): 
     roll = random.randint(1,6) 
     counts[roll - 1] += 1 
    return counts 
+0

그런데 지금은 그런 바보 같은 실수를 만들기위한 바보가 된 기분. 시간 내 주셔서 감사하지만 맞춤법 검사를 해주셔서 감사합니다. –

+0

Errr ... @MartijnPieters는 항상 이런 종류의 알고리즘을 재 작성하는 모든 사람들보다 빠릅니다. p –

-1

, 그렇지 않으면 당신은 내가 마티 피에 터스의 답변을 향상시킬 수없는 6

... 
roll = random.randint(1, 7) 
+3

아니요,'randint()'는 * 포함됩니다. 당신은'randrange()'를 생각하고 있습니다. –

+0

아니요, 포괄적 인 내용은 아닙니다. 'randint' docstring은 다음과 같이 말합니다 : *'low' (포함)에서'high' (배타적)까지의 임의의 정수를 반환합니다. * – user278064

+0

http://docs.python.org/2/library/random.html#random을 참조하십시오. .randint,'a = N <= b' 인 임의의 정수 N을 반환합니다. –

0

를 얻을하지 않습니다. :-)하지만이 문제는 목록을 사용하면보다 편리하게 해결할 수 있습니다. 왜 제로 자신을 계산

rolls = [0] * 7 

:

import random 

def rollDie(number): 
    # create a list with 7 values; we will only use the top six 
    rolls = [0, 0, 0, 0, 0, 0, 0] 
    for i in range(0, number): 
     roll=int(random.randint(1,6)) 
     rolls[roll] += 1 
    return rolls 

if __name__ == "__main__": 
    result = rollDie(1000) 
    print(result[1:]) # print only the indices from 1 to 6 

그리고,이 모두가 제로로 설정 7 개 항목의 목록을 만들 수있는 더 좋은 방법이 여기에 조금 까다 롭습니다하지만? 파이썬이 당신을 위해 일하게하는 것이 더 쉽습니다. :-)

편집 : 색인은 1부터 6까지의 색인을 사용하기 때문에 길이가 7입니다. 목록에는 위치 0이 있지만 사용하지 않습니다.

또 다른 방법은 주사위 굴림을 색인에 매핑하는 것입니다. 꽤 간단한 매핑입니다. 1을 뺍니다. 따라서 1의 주사위 굴림은 목록의 색인 0으로 이동하고 2의 주사위 굴림은 1로 이동합니다. 이제 우리는 목록의 모든 위치를 사용합니다.

여기에 해당 버전의 :

import random 

def rollDie(number): 
    rolls = [0] * 6 
    for i in range(0, number): 
     roll=int(random.randint(1,6)) 
     rolls[roll - 1] += 1 
    return rolls 

if __name__ == "__main__": 
    result = rollDie(1000) 
    print(result) 
+0

6 면면 왜 죽을까요? – Fatlad

+0

난수는 1에서 6까지이지만 목록 색인은 0부터 시작합니다. 목록을 6 길이로 만들 수도 있지만 각 롤에서 1을 뺍니다. 흠, 나는 대답에 그것을 추가 할 것이다. – steveha

+0

네, 미안 해요, 다시 내 의견이 상당히 nitpick, 나는 멀리 slink하고 수면 부족에 대한 책임을 비난했다. ... – Fatlad

-2
import random 

def dice(): 

    print random.randint(1,6) 

dice() 
+1

OP가 무엇을 잘못했는지 설명 왜 당신의 대답은 더받은 것입니다 왜 당신의 대답은 여기있는 나머지 부분보다 낫습니다. – zondo

관련 문제