Mik*_*ley 0 python probability dice
问题:我需要掷3个骰子.如果两个(或三个)骰子返回相同的数字,则停止.如果3个骰子都是唯一的(例如2,4和6),则再次滚动.执行此操作,直到双打/三重滚动,或7次,以先到者为准.
注意:我是一个python newb.
这是我到目前为止所做的,但所有这一切实际上产生了216种可能的组合:
import itertools
all_possible = list(itertools.permutations([1,2,3,4,5,6],3))
input = raw_input()
print all_possible
Run Code Online (Sandbox Code Playgroud)
这会产生这种类型的输出:
[(1, 2, 3), (1, 2, 4), (1, 2, 5), (1, 2, 6), (1, 3, 2), (1, 3, 4), (1, 3, 5), (1, 3, 6), (1, 4, 2), (1, 4, 3), (1, 4, 5), (1, 4, 6), (1, 5, 2), (1, 5, 3), (1, 5, 4), (1, 5, 6), (1, 6, 2), (1, 6, 3), (1, 6, 4), (1, 6, 5), (2, 1, 3), (2, 1, 4), (2, 1, 5), (2, 1, 6), (2, 3, 1), (2, 3, 4), (2, 3, 5), (2, 3, 6), (2, 4, 1), (2, 4, 3), (2, 4, 5), (2, 4, 6), (2, 5, 1), (2, 5, 3), (2, 5, 4), (2, 5, 6), (2, 6, 1), (2, 6, 3), (2, 6, 4), (2, 6, 5), (3, 1, 2), (3, 1, 4), (3, 1, 5), (3, 1, 6), (3, 2, 1), (3, 2, 4), (3, 2, 5), (3, 2, 6), (3, 4, 1), (3, 4, 2), (3, 4, 5), (3, 4, 6), (3, 5, 1), (3, 5, 2), (3, 5, 4), (3, 5, 6), (3, 6, 1), (3, 6, 2), (3, 6, 4), (3, 6, 5), (4, 1, 2), (4, 1, 3), (4, 1, 5), (4, 1, 6), (4, 2, 1), (4, 2, 3), (4, 2, 5), (4, 2, 6), (4, 3, 1), (4, 3, 2), (4, 3, 5), (4, 3, 6), (4, 5, 1), (4, 5, 2), (4, 5, 3), (4, 5, 6), (4, 6, 1), (4, 6, 2), (4, 6, 3), (4, 6, 5), (5, 1, 2), (5, 1, 3), (5, 1, 4), (5, 1, 6), (5, 2, 1), (5, 2, 3), (5, 2, 4), (5, 2, 6), (5, 3, 1), (5, 3, 2), (5, 3, 4), (5, 3, 6), (5, 4, 1), (5, 4, 2), (5, 4, 3), (5, 4, 6), (5, 6, 1), (5, 6, 2), (5, 6, 3), (5, 6, 4), (6, 1, 2), (6, 1, 3), (6, 1, 4), (6, 1, 5), (6, 2, 1), (6, 2, 3), (6, 2, 4), (6, 2, 5), (6, 3, 1), (6, 3, 2), (6, 3, 4), (6, 3, 5), (6, 4, 1), (6, 4, 2), (6, 4, 3), (6, 4, 5), (6, 5, 1), (6, 5, 2), (6, 5, 3), (6, 5, 4)]
这也不是很好,因为它只产生NO双打或三倍 - 据我所知,一切都只是唯一的组合.
----------更新-----------好的 - 我拿了这个并通过剥离数组中的每个值并将它们相加来扩展它(可能至少有效的方式).它有效,如果在休息之前有多个集合,它们都会打印出来.我现在要做的就是总结.所以:
def gen_random_termagants():
for _ in range(7):
# instead of three separate variables, we use a list here
# the nice thing is, that you can freely vary the number of
# 'parallel' dice rolls this way
dice = [random.randint(1, 6) for _ in range(3)]
# this is more general and will break as soon as there are
# duplicate (die) values in the list (meaning, break, if not all elements
# are different)
first_die = dice[0]
second_die = dice[1]
third_die = dice[2]
total_term = first_die + second_die + third_die
print "Total: %s" % total_term
if len(dice) > len(set(dice)):
break
Run Code Online (Sandbox Code Playgroud)
这是输出样本:
How many tervigons? ::>3
Let's calculate some termagants based on 3 tervigons...
You'll get a minimum of 9 termagants per turn.
You'll get a maximum of 54 termagants per turn.
minimums: 5 turns [45] :: 6 turns [54] :: 7 turns [63]
averages: 5 turns [157] :: 6 turns [189] :: 7 turns [220]
maximums: 5 turns [270] :: 6 turns [324] :: 7 turns [378]
Total: 9
Total: 8
Run Code Online (Sandbox Code Playgroud)
所以在这个例子中,我希望它返回17(即9 + 8).
Python附带了一个很棒的标准库(正如您在使用itertools时可能已经发现的那样),您还可以在其中找到一个随机模块.
您可以使用random.randint来模拟骰子卷.有多种方法可以解决这个问题.第一个代码示例有些限制,第二个代码示例更为通用.
import random
# '_' (underscore) is used for values that are generated, but that you do not
# care about - here we only want to repeat seven times and do not care about
# the actual loop count
for _ in range(7):
# generate three random numbers between [1 and 6]
# and store the values in a, b, c respectively (tuple unpacking)
a, b, c = (random.randint(1, 6) for _ in range(3))
# if one of the conditions holds, break out of the loop early
if a == b or a == c or b == c or a == b == c:
break
Run Code Online (Sandbox Code Playgroud)
正如@Paulo指出的那样,您可以使用另一种更简洁的方法来检查n列表(或元组)的元素是否都不同,即您将所有元素放在集合中:
for _ in range(7):
# instead of three separate variables, we use a list here
# the nice thing is, that you can freely vary the number of
# 'parallel' dice rolls this way
dice = [random.randint(1, 6) for _ in range(3)]
# this is more general and will break as soon as there are
# duplicate (die) values in the list (meaning, break, if not all elements
# are different)
if len(dice) > len(set(dice)):
break
Run Code Online (Sandbox Code Playgroud)
回答您的更新问题,只需使用sum:
total = sum(dice)
Run Code Online (Sandbox Code Playgroud)