Как можно улучшить эти простые функции броска кубиков для построения графиков гистограмм? - PullRequest
0 голосов
/ 09 мая 2020

Более быстрый способ закодировать это?

Мне было интересно, может ли кто-нибудь предложить более быстрый способ закодировать это? Мне было поручено сделать функции броска кубиков на 2-3 кубика и отобразить результаты в виде гистограммы. Я знаю, что циклы while / for не являются быстрым в python. Может ли кто-нибудь предложить более быструю встроенную функцию для достижения этого?

import numpy as np
import matplotlib.pyplot as plt
#Write a function that will return a random int between 1-6
def roll_die():
    x = np.random.random_integers(6)
    return x
#A function to calculate the sum of 2 dice using a while loop
def rolling2(x):
    n=0
    while(n < rolls):
        sum = roll_die() + roll_die()
        arr[n] = sum
        sum = 0
        n = n + 1

#A function to calculate the sum of 3 dice using a while loop
def rolling3(x):
    n=0
    while(n < rolls):
        sum = roll_die() + roll_die() + roll_die()
        arr[n] = sum
        sum = 0
        n = n + 1

rolls = int (input("How many times will you roll 2 dice?"))
#Initialise 2 arrays to store values
arr = np.zeros(rolls)
arr1 = np.zeros(rolls)
#Calling rolling functions
rolling2(arr)
print (arr)

rolling3(arr1)
print(arr1)
#Plot graph using matplotlib methods and functions
fig, ax = plt.subplots(2,1)
ax[0].hist(arr, bins=11)
ax[0].set_xlabel("Sum of 2 Dice")
ax[0].set_label("Frequency")
ax[0].set_title("Frequency of the Sum of Rolling 2 dice")

ax[1].hist(arr, bins=16)
ax[1].set_xlabel("Sum of 3 Dice")
ax[1].set_label("Frequency")
ax[1].set_title("Frequency of the Sum of Rolling 3 dice")
plt.show()

1 Ответ

0 голосов
/ 09 мая 2020

Вы можете использовать понимание списка и сразу суммировать в нем два или три броска кубика:

Я также убрал ваше использование инициализированных массивов, поскольку оно не нужно. Лучше использовать значение return, чем изменять массивы.

import numpy as np
import matplotlib.pyplot as plt

# A function that will return a random int between 1-6.
def roll_die():
    return np.random.random_integers(6)

# A function to calculate the sum of 2 dice rolls.
def rolling2(rolls):
    return [(roll_die() + roll_die()) for n in range(rolls)]

# A function to calculate the sum of 3 dice rolls.
def rolling3(rolls):
    return [(roll_die() + roll_die() + roll_die()) for n in range(rolls)]

rolls = int(input("How many times will you roll 2 dice?"))
array2 = rolling2(rolls)
array3 = rolling3(rolls)
print(array2)
print(array3)

# Plot graph using matplotlib methods and functions.
fig, ax = plt.subplots(2,1)
ax[0].hist(array2, bins=11)
ax[0].set_xlabel("Sum of 2 dices")
ax[0].set_label("Frequency")
ax[0].set_title("Frequency of the Sum of Rolling 2 dice")

ax[1].hist(array3, bins=16)
ax[1].set_xlabel("Sum of 3 dices")
ax[1].set_label("Frequency")
ax[1].set_title("Frequency of the Sum of Rolling 3 dice")
plt.show()

Было бы также неплохо написать функцию, которая бросает любое количество кубиков любое количество раз. Вот он:

def roll_dices(dices, rolls):
    return [sum(roll_die() for _ in range(dices)) for _ in range(rolls)]

Тогда вы можете звонить roll_dices(2, rolls) вместо rolling2(rolls).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...