2016-11-19 9 views
0

私はいくつかのコーディング経験がないと苦労しています。私が下に書いたコードは、見るのが非常に不便で醜いです。より効率的に計算する確率

私はあなたに質問します: これをより効率的に行うにはどうすればいいですか?私がそれをする方法は、むしろ非効率的です。コードのdef freq_2dice(n, N):セクションとprintステートメントに注意してください。それらは私がより効率的であるだけでなく、より良い見た目のコードを必要とする分野です。

ありがとうございます!

EDIT:この割り当ては、2つのダイスを投げるときに可能な合計のそれぞれを得る確率を記録して格納する関数を作成することです。n回。

残りのコードは、これらの確率を正確な確率と比較しています。

EDIT2:それは2サイコロを投げるのn、すなわち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

私はそれをやってみました。しかし、その関数に '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、私はスコアを数えるために辞書を作ってみましたが、私は失敗しました。私はdictを定義した関数のどこに 'N'と' n'を実装するのか分かりませんでした。 – FrenziedMango

+0

@FrenziedMangoおそらくもっと分かりやすい答えを再構築しました。他の質問にもお答えできます。注: '_'は、変数名を使用することができる未使用変数を示すためのPythonの規約です。 「私」 – AChampion