我有3个模具,每个模具有13个边。你必须" roll"它们直到你让所有三个值相同(如下所示)。
ct = 1
import random
min = 1
max = 13
roll_again = "yes"
while roll_again == "yes" or roll_again == "y" or roll_again == "":
print "This is attempt number: ", + ct
print "Now, rolling the dice..."
print "The values are...."
die1 = random.randint(min, max)
die2 = random.randint(min, max)
die3 = random.randint(min, max)
print die1
print die2
print die3
ct += 1
if die1 == die2:
if die2 == die3:
print "Congrats! You win! hooray! You got it on attempt number ", + ct
ct = 1
roll_again = raw_input("Roll the dice again? ")
一切正常,
但是我希望1张脸比其余的(比如加重的骰子)高出5倍,并且脸13比其他人上升5倍(当然不包括1值)。这在Python 2.7中是否可行?
答案 0 :(得分:3)
我曾发布an answer to a similar question(尽管是在Java中),其中某人想要选择具有不同概率的字母表字母。你可以采取我在那里建议的任何一种方法。
最通用的方法是计算选择每个数字的概率。您可能有一个(数字,概率)元组列表,例如
choices = [(1, 0.2), (2, 0.05), (3, 0.3113), ...]
然后你可以通过选择一个介于0和1之间的随机数进行随机选择,迭代列表,随意添加概率,当你得到一个大于你选择的随机数的总和时,停止并返回相应的选择。
def random_choice(choices):
r = random.random()
cdf = 0
for number, cumulative_probability in choices:
cdf += cumulative_probability
if r < cdf:
return number
return choices[-1][0]
(请注意,Python 2中不存在itertools.accumulate()
,否则您可以在此处使用它。)
如果你碰巧使用的是Numpy,它的内置功能为numpy.random.choice(numbers, p=probabilities)
。
但是,如果所有概率都是某个值的倍数,那么使用random.choice()
可能会更好。要做到这一点,你需要创建一个可能的选项列表没有概率,重复每个选项足以得到你想要的相对比例。例如,
choices = [1, 1, 1, 2, 3, 3, 4]
会导致1
的可能性是2
或4
的三倍,3
的可能性是2
或{{1}的两倍}}。然后在每次想要掷骰子时调用4
。
在你的情况下,第二种方法看起来很合适,但你也可以使用。我会留给你,为你的案例找出random.choice(choices)
的正确定义。 ; - )
答案 1 :(得分:0)
我认为您正在寻找的工具是numpy.random.choice()
此工具允许您通过将所有事件的概率列表作为参数来生成遵循非等概率概率法的数字
probability_A = 0.1
probability_B = 0.5
probability_C = 0.4
print(numpy.random.choice(numpy.arange(1, 4), p = [probability_A, probability_B, probability_C]))
在您的情况下,您首先需要计算概率。
如果你知道数字“1”的权重为5而数字“13”的权重为5,你可以用这种方式生成一个向量(Python语言列表):
weights = [5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.5]
probabilities = [weight/sum(weights) for weight in weights]
最后
numpy.random.choice(numpy.arange(1, 14), p = probabilities)