你能改变一个数字出现的概率吗?

2024-10-06 10:32:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我有3个骰子,每个有13个面。你必须“滚动”它们,直到三个值都相同(如下所示)。在

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? ")

这一切都很好

Here it is running after I got three numbers in a row...

但我希望1面能比其他面高出5倍(就像一个加权骰子),而13面要比其他面高5倍(当然不包括1值)。这在Python2.7中是否可行?在


Tags: orrandommin骰子maxyesprintroll
2条回答

我曾经发布过an answer to a similar question(尽管是用Java编写的),其中有人想用不同的概率选择字母表中的字母。你可以采取我在那里建议的任何一种方法。在

最普遍的方法是计算选择每个数字的概率。例如,您可能有一个元组(number,probability)的列表

choices = [(1, 0.2), (2, 0.05), (3, 0.3113), ...]

然后你可以选择一个介于0和1之间的随机数,在列表中迭代,在前进的过程中把概率加起来,当你得到一个大于你选择的随机数的和时,停止并返回相应的选择。在

^{pr2}$

(请注意,itertools.accumulate()在python2中不存在,否则可以在这里使用它。)

如果您碰巧使用的是Numpy,那么它的内置功能是numpy.random.choice(numbers, p=probabilities)。在

如果所有的概率都是某个值的倍数,那么使用random.choice()可能会更好。要做到这一点,你需要创建一个没有概率的可能选择列表,重复每一个选项以得到你想要的相对比例。例如

choices = [1, 1, 1, 2, 3, 3, 4]

会导致1的可能性是2或{}的三倍,而{}的可能性是{}或{}的两倍。然后每次你想掷骰子的时候只要打电话给random.choice(choices)。在

在您的情况下,第二种方法似乎非常适合,但是您可以使用任何一种方法。我将留给您来为您的案例找出choices的正确定义。;—)

我想你要找的工具是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语言中的列表):

^{pr2}$

最后呢

numpy.random.choice(numpy.arange(1, 14), p = probabilities)

相关问题 更多 >