Я изо всех сил пытаюсь исправить ошибки. Код, который я написал ниже, крайне неудобен и уродлив.Более эффективные вычислительные вероятности
Мой вопрос: Как это можно сделать более эффективно? То, как я выбрал это, довольно неэффективно. Обратите внимание на раздел кода def freq_2dice(n, N):
, а также инструкции print
. Это те области, в которых мне нужна более эффективная работа, а также хороший код.
Спасибо!
EDIT: Назначение - создать функцию, которая записывает и сохраняет каждую из вероятностей получения каждой из возможных сумм при метании 2 кубиков, n
раз.
Остальная часть кода сравнивает эти вероятности с точными вероятностями.
EDIT2: Ошибка в коде
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
'''
Возможно, вам нужен список (массив) вместо использования переменных M, A, ... P, D. – LarsH
Ну, например, вы могли бы заменить все операторы 'if' на' dict', например. 's_values_dict = {2: 'M', 3: 'A', 4: 'E', 5: 'R', ...}' Тогда вы можете просто ссылаться на любой ключ в словаре вместо того, чтобы иметь все эти ' if's. – blacksite
Я пытался это сделать. Сделав его «dict», я не знал, как реализовать 'n' и' N' в этой функции. Как и в 'xrange (n)' и 'xrange (N)', я просто не знал, как его записать. – FrenziedMango