Je travaille sur un programme de probabilité pour les dés et j'ai rencontré quelques problèmes d'efficacité dans la section de permutation lorsque les nombres deviennent grands. Par exemple, les périmètres que je dois exécuter sont 10 dés, avec 10 faces, avec un résultat de 50.
J'ai besoin d'un nombre total de permutations pour calculer la probabilité du résultat spécifié compte tenu du nombre de dés et du nombre de faces. Le site final_count(total, dice, faces)
laisse passer le plus petit nombre de combinaisons du générateur avant de passer dans la fonction perms(x)
fonction.
Le code suivant fonctionne, mais pour les périmètres mentionnés précédemment, il prend un temps extrêmement long.
En perms(x)
a été posté par @Ashish Datta à partir de ce fil : permutations avec des valeurs uniques C'est là que je pense avoir besoin d'aide.
import itertools as it
total = 50
dice = 10
faces = 10
#-------------functions---------------------
# Checks for lists of ALL the same items
def same(lst):
return lst[1:] == lst[:-1]
# Generates the number of original permutations (10 digits takes 1.65s)
def perms(x):
uniq_set = set()
for out in it.permutations(x, len(x)):
if out not in uniq_set:
uniq_set.update([out])
return len(uniq_set)
# Finds total original dice rolls. "combinations" = (10d, 10f, 50t, takes 0.42s)
def final_count(total, dice, faces):
combinations = (it.combinations_with_replacement(range(1, faces+1), dice))
count = 0
for i in combinations:
if sum(i) == total and same(i) == True:
count += 1
elif sum(i) == total and same(i) != True:
count += perms(i)
else:
pass
return count
# --------------functions-------------------
answer = final_count(total, dice, faces) / float(faces**dice)
print(round(answer,4))
J'ai lu le fil de discussion Comment améliorer l'efficacité de l'algorithme de permutation avec python . Je crois que ma question est différente, bien qu'un algorithme plus intelligent soit mon objectif final.
J'ai initialement publié ma première ébauche de ce programme dans CodeReview. https://codereview.stackexchange.com/questions/212930/calculate-probability-of-dice-total . Je me rends compte que je suis sur la corde raide entre une question et un examen du code, mais je pense que dans ce cas, je suis plus du côté des questions :)