2016-11-19 6 views
0

코딩 경험이 부족합니다. 아래에 작성한 코드는 매우 불편하고보기에는보기 흉한 코드입니다.보다 효율적으로 컴퓨팅 확률

내 질문은 : 어떻게하면 더 효율적으로 할 수 있습니까? 내가 선택한 방식은 다소 비효율적입니다. 코드의 def freq_2dice(n, N): 섹션과 print 문에주의하십시오. 그것들은 내가 더 좋은 코드뿐만 아니라 더 많은 효율성을 필요로하는 분야입니다.

감사합니다.

EDIT :이 할당은 2 개의 주사위를 던질 때 각각의 가능한 합계를 얻는 각각의 가능성을 기록하고 저장하는 함수를 만드는 것입니다. n 번.

나머지 코드는이 확률을 정확한 확률과 비교합니다.

EDIT2 : 그것은, n2 주사위를 던지는 즉 100000 실행해야 같은 오류 코드

from random import randint 
import sys 

def freq_2dice(n, N): 
    M, A, E, R, T, Y, U, I, O, P, D = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 
    for reps in xrange(N): 
     s = 0 
     for dice in xrange(n): 
      outcome = randint(1, 6) 
      s += outcome 
     if s==2: 
      M += 1 
     if s==3: 
      A += 1 
     if s==4: 
      E += 1 
     if s==5: 
      R += 1 
     if s==6: 
      T += 1 
     if s==7: 
      Y += 1 
     if s==8: 
      U += 1 
     if s==9: 
      I += 1 
     if s==10: 
      O += 1 
     if s==11: 
      P += 1 
     if s==12: 
      D += 1 
    return N*(float(M)/N), N*(float(A)/N), N*(float(E)/N), N*(float(R)/N), N*(float(T)/N), N*(float(Y)/N), N*(float(U)/N), N*(float(I)/N), N*(float(O)/N), N*(float(P)/N), N*(float(D)/N) 

def chance_die(): 
    frequencies = {} 
    for s in range(2, 13): 
     frequency = 0 
     for die1 in range(1, 7): 
      for die2 in range(1, 7): 
       if die1 + die2 == s: 
        frequency += 1 
     frequencies[s] = frequency 
    return frequencies 


n = int(sys.argv[1]) 
N = int(sys.argv[2]) 

print 'No. of twos: %d, probability: %.2f, expected: %.2f' % (freq_2dice(n, N)[0], freq_2dice(n, N)[0]/(N/100), chance_die()[2]/.36) 
print 'No. of twos: %d, probability: %.2f, expected: %.2f' % (freq_2dice(n, N)[1], freq_2dice(n, N)[0]/(N/100), chance_die()[3]/.36) 
print 'No. of twos: %d, probability: %.2f, expected: %.2f' % (freq_2dice(n, N)[2], freq_2dice(n, N)[0]/(N/100), chance_die()[4]/.36) 
print 'No. of twos: %d, probability: %.2f, expected: %.2f' % (freq_2dice(n, N)[3], freq_2dice(n, N)[0]/(N/100), chance_die()[5]/.36) 
print 'No. of twos: %d, probability: %.2f, expected: %.2f' % (freq_2dice(n, N)[4], freq_2dice(n, N)[0]/(N/100), chance_die()[6]/.36) 
print 'No. of twos: %d, probability: %.2f, expected: %.2f' % (freq_2dice(n, N)[5], freq_2dice(n, N)[0]/(N/100), chance_die()[7]/.36) 
print 'No. of twos: %d, probability: %.2f, expected: %.2f' % (freq_2dice(n, N)[6], freq_2dice(n, N)[0]/(N/100), chance_die()[8]/.36) 
print 'No. of twos: %d, probability: %.2f, expected: %.2f' % (freq_2dice(n, N)[7], freq_2dice(n, N)[0]/(N/100), chance_die()[9]/.36) 
print 'No. of twos: %d, probability: %.2f, expected: %.2f' % (freq_2dice(n, N)[8], freq_2dice(n, N)[0]/(N/100), chance_die()[10]/.36) 
print 'No. of twos: %d, probability: %.2f, expected: %.2f' % (freq_2dice(n, N)[9], freq_2dice(n, N)[0]/(N/100), chance_die()[11]/.36) 
print 'No. of twos: %d, probability: %.2f, expected: %.2f' % (freq_2dice(n, N)[10], freq_2dice(n, N)[0]/(N/100), chance_die()[12]/.36) 

''' 

MacBook-Air:python Leroy$ python freq_2dice.py 2 100000 
No. of twos: 2680, probability: 2.80, expected: 2.78 
No. of threes: 5612, probability: 5.51, expected: 5.56 
No. of fours: 8169, probability: 8.43, expected: 8.33 
No. of fives: 11099, probability: 10.96, expected: 11.11 
No. of sixes: 13827, probability: 13.91, expected: 13.89 
No. of sevens: 16610, probability: 16.51, expected: 16.67 
No. of eights: 13808, probability: 13.72, expected: 13.89 
No. of nines: 10947, probability: 11.22, expected: 11.11 
No. of tens: 8249, probability: 8.35, expected: 8.33 
No. of elevens: 5540, probability: 5.59, expected: 5.56 
No. of twelves: 2805, probability: 2.74, expected: 2.78 

''' 
+0

변수 M, A, ... P, D를 사용하는 대신 목록 (배열)을 원할 것입니다. – LarsH

+0

글쎄, 하나의 경우, 모든 if 문을 'dict'으로 바꿀 수 있습니다. 's_values_dict = {2 : 'M', 3 : 'A', 4 : 'E', 5 : 'R', ...}'그렇다면 사전에있는 모든 키를 대신 참조 할 수 있습니다. if's. – blacksite

+0

나는 그 일을 시도했다. 그러나이를'dict'으로 만들었지 만, 그 함수에서'n'과'N'을 구현하는 방법을 몰랐습니다. 'xrange (n)'과'xrange (N)'에서처럼 나는 그것을 쓰는 방법을 모른다. – FrenziedMango

답변

1

두 번째 루프에서 잘못된 N를 사용하는에, 그것은 보인다.
정말로 모든 변수가 필요하지는 않지만 점수를 계산하려면 dict을 키로 사용하십시오.
print에 대해 freq_2dice()을 호출합니다. 이는 각 인쇄마다 N*n이 부름을 의미합니다.

result = freq_2dice(n, N) 
print ... result[0] ... 
print ... result[1] ... 
... 

거푸집 수가 많음에도 불구하고 2 개의 거푸집을 사용하는 영역이 많이 있습니다.

dict{score: count} 유지하기 위해 사용 예 :

from random import randint 

def freq_ndice(n, N): 
    d = {} 
    for _ in range(N): 
     score = sum(randint(1, 6) for _ in range(n)) 
     d[score] = d.get(score, 0) + 1 
    return d 

을하지만 결국 당신이 일의 발생 카운트 업 dict의 한 형태 인 collections.Counter()와 주파수 계산을 많이 단순화 할 수 있습니다 :

from collection import Counter 

def freq_ndice(n, N): 
    return Counter(sum(random.randint(1, 6) for _ in range(n)) for _ in range(N)) 

>>> n, N = 2, 100000 
>>> for score, count in freq_ndice(n, N).items(): 
...  print('No. of {}s: {}, probability: {:.2f}%'.format(score, count, 100*count/N)) 
No. of 2s: 2870, probability: 2.87% 
No. of 3s: 5533, probability: 5.53% 
No. of 4s: 8386, probability: 8.39% 
No. of 5s: 11081, probability: 11.08% 
No. of 6s: 13947, probability: 13.95% 
No. of 7s: 16649, probability: 16.65% 
No. of 8s: 13850, probability: 13.85% 
No. of 9s: 11166, probability: 11.17% 
No. of 10s: 8166, probability: 8.17% 
No. of 11s: 5496, probability: 5.50% 
No. of 12s: 2856, probability: 2.86% 
1 loop, best of 3: 900 ms per loop 

참고 : Python2 ... xrange, from __future__ import print_function100.0을 Python2에서 사용

+0

의견에 감사드립니다. 'N'을 'n'으로 편집했지만, 내가 그랬을 때 답을 쓰고있는 것 같습니다. 방금 ​​한 일은 훌륭한 솔루션처럼 보입니다. 불필요한 코드가 불편을 겪는 대신 내 코드에서 구현하는 방법을 잘 모릅니다. 나는 아주 새롭다. 더 자세히 설명해 주시겠습니까? 아니면 너무 많이 물어봐도 될까요? 편집 : 오, btw, 나는 점수를 계산하기 위해 사전을 만들려고했으나 실패했습니다. 내가 딕트를 정의한 곳에서 'N'과 'n'을 어디에서 구현하는지 알지 못했다. – FrenziedMango

+0

@FrenziedMango 해답을 재구성했습니다. 아마도 더 이해하기 쉽습니다. 다른 질문에 대답 해주십시오. 참고 :'_'은 파이썬에서 사용되지 않는 변수를 나타내는 규칙입니다. 예를 들어, 변수 이름을 사용할 수 있습니다. '나' – AChampion