【问题标题】:Can you change the probability of a number coming up?你能改变一个数字出现的概率吗?
【发布时间】:2017-03-27 20:37:39
【问题描述】:

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

这一切都很好,

但我希望 1 面能够比其他面高出 5 倍(如加权骰子),而 13 面能够比其他面高出 0.5 倍(当然不包括 1 值)。这在 Python 2.7 中可行吗?

【问题讨论】:

  • 你可以做的是将random.randint()设置为更大的范围,然后根据生成的数字所在的数字范围返回所需的结果,所以说如果你想要@987654324要更频繁地出现@,您可以将randint 的边界设置为(1, 11),并将大于6 的所有内容都计算为1。 (不确定这是否让您难以理解)
  • 您可以创建一个包含 10 个 1s、1 个 13 和 2 个其他所有内容的群体,然后使用 random.samplerandom.choice
  • 非常感谢!我认为这两种方法都行得通!

标签: python python-2.7


【解决方案1】:

我曾经发布过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]

(请注意,itertools.accumulate() 在 Python 2 中不存在,否则您可以在此处使用它。)

如果你碰巧在使用 Numpy,它会以 numpy.random.choice(numbers, p=probabilities) 的形式内置此功能。

如果您的所有概率都是某个值的倍数,那么您最好使用random.choice()。为此,您将创建一个没有概率的可能选择列表,重复每个选项以获得所需的相对比例。例如,

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

将导致1 的可能性是24 的三倍,3 的可能性是24 的两倍。然后,每次您想掷骰子时,只需致电random.choice(choices)

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

【讨论】:

    【解决方案2】:

    我认为您正在寻找的工具是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)
    

    【讨论】:

      猜你喜欢
      • 2023-04-11
      • 2018-05-23
      • 2015-05-03
      • 2022-12-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-05
      • 2014-09-29
      • 2013-08-07
      相关资源
      最近更新 更多