2014-07-16 5 views
1

어떤 컴퓨터의 임의 번호가 실제로 무작위가 아니라는 것을 알고 있습니다. 그러나 현재 얻고있는 것보다 조금 더 변형 될 것으로 예상됩니다. 나는 주사위 굴림을 시뮬레이트하려고합니다. 예를 들어 4d6은 6 면체 주사위 4 개가 될 것입니다. 이것은 단순히 4에서 24 사이의 임의의 숫자를 생성하는 것보다 훨씬 정확합니다. 여기서는 확률 곡선에 들어 가지 않습니다.파이썬 : 무작위 시드 문제

내가 찾는 것은 현재 시스템 시간을 사용하지 않는 것입니다. 느낄 수있는 모든 씨앗만큼 좋은, 잘못 될 수) 번호가 일관되게 낮은되었습니다. 나는 3d6의 약 50 롤 이후에 한 번도 12를 초과하는 금액을 얻은 적이 없다는 것을 의미합니다. 범위의 1/3의 0 히트 비율입니다. 특히 이상하다고 생각합니다. 여기

희망 누군가가 아마도 시스템 시간에서 파종이 할 수있는 더 좋은 방법을 알고, 본질적으로 나쁜 몇 가지 코드입니다 그리고 난 그냥 아무 생각이 없다 : (나는 생략 비 관련 클래스 정의)

from random import randrange, seed 

def dieroll(self,numrolls,dierange): 
    """ This method will return 'num' rolls of a d'range' die. 
    For example, 4d6 will simulate four rolls of a 6-sided die. """ 

    seed() 
    sum = 0 
    for roll in range(0, numrolls): 
     dieroll = randrange(1,dierange) 
     sum = sum + dieroll 
    print("Sum = %d" % sum) 
을 여기

내 결과의 작은 샘플입니다 : 내가 값의 종형 곡선을 기대하고,이 작은 샘플 세트하지만 내 전반적인 결과를 (I 전체 (50 개) 결과를 게시하지 않을했다)

>>> c.dieroll(3,6) 
Sum = 3 
>>> c.dieroll(3,6) 
Sum = 11 
>>> c.dieroll(3,6) 
Sum = 9 
>>> c.dieroll(3,6) 
Sum = 9 
>>> c.dieroll(3,6) 
Sum = 10 
>>> c.dieroll(3,6) 
Sum = 11 
>>> c.dieroll(3,6) 
Sum = 7 
>>> c.dieroll(3,6) 
Sum = 7 
>>> c.dieroll(3,6) 
Sum = 11 
>>> c.dieroll(3,6) 
Sum = 11 
>>> c.dieroll(3,6) 
Sum = 4 
>>> c.dieroll(3,6) 
Sum = 11 
>>> c.dieroll(3,6) 
Sum = 6 
>>> c.dieroll(3,6) 
Sum = 12 
>>> c.dieroll(3,6) 
Sum = 6 
>>> c.dieroll(3,6) 
Sum = 8 
>>> c.dieroll(3,6) 
Sum = 8 

낮은 쪽에서 매우 비뚤어진 다.

이 도움말에 도움을 주셔서 감사합니다. -이 결과가 가능한 한 "실제 주사위"처럼 현실적 이길 바랍니다.

편집 : 약 20 번 더 굴러서 13과 14를 얻을 수 있었기 때문에 가능하다는 것을 알았습니다. 나는 약 10 세 이하였습니다.

두 번째 편집 : dierange가 dierange가되어야 함을 깨달았습니다. 1 - 1d6이 1-5의 결과를 일관되게 반환했습니다 ... 여전히 시드가 정확할 수 있는지 확실하지 않습니다.

+0

왜 파종을하고 있습니까? 결정적 출력을 보장하기 위해 일반적으로 테스트 할 때만 RNG를 시드합니다. 또한, 당신은 어떤 인스턴스 속성도 사용하고 있지 않습니다 - 이것을 @ staticmethod로 만드는 것을 고려하십시오. – jonrsharpe

+0

어쩌면 오래되었지만 난 임의의 숫자를 생성 할 때 항상 시드해야한다고 생각했는데 그렇지 않은가요? 파이썬에서 만든 첫 번째 RNG입니다. –

+0

이것은 매우 이상합니다. 그러나'randrange (1, dierange)'대신'(random.randint (1,50000) % dierange) +1 '을 시도해 볼 수 있습니다. (코드가 좋지만 문제가 있는지 확인하기 만하면됩니다.) – Elisha

답변

5

randrangerange과 같이 상한을 포함하지 않습니다.

귀하의 다이는 않습니다이 상한을 포함하는, a는 6 ..

randint 비교가 없습니다.

+0

DSM에 감사드립니다. 게시하기 직전에 그 사실을 깨달았습니다. 코드를 업데이트 했으므로 실제 주사위와 일치하는 예상 결과가 더 많이 생성됩니다. 감사! (시간 제한이 만료되었을 때 답변으로 표시 할 것입니다.) 코드가 정확하다는 것을 확인하는 것이 아니라 시드 문제라고 생각하면서 너무 많은 시간을 보냈습니다. –

+1

@TimS :'collections.Counter'에 관심이 있습니다. 함수를 수정하여 값을 반환하면'Counter (c.dieroll (3, 6) for i (범위 : 10 ** 6))와 같은 것을 쓸 수 있고 좋은 분포를 얻을 수 있습니다. [PS : 자신의 변수로 내장 함수'sum'을 음영 처리하는 것은 나쁜 습관입니다.] – DSM

+0

덕분에 일반적으로 더 긴 변수를 만들어서 내장 함수를 간섭하지 않고 함께 던졌습니다. 나는 코드를 확실히 업데이트 할 것이다. 카운터는 꽤 멋져 보이고, 나는 그것을 시도 할 것이다. 도움을 감사하십시오! –