使用概率分布扩展整数的随机范围

时间:2018-12-17 21:29:39

标签: python random integer probability dice

我试图解决经典的问题,即产生一个生成1到5之间的随机整数的函数。 我的方法是将2个调用的结果添加到rand5()中,从而有效地将其转化为“骰子总和”问题。总掷骰子的概率相当容易计算,因此我在这里使用了它。在代码之后对此进行解释

我的问题是:如何计算计数器的值是多少?经过实验验证,当前值不正确。是否存在满足概率的整数值?有没有更好的方法可以解决这种问题呢?

def rand5():
    return random.randint(1,5)

def rand7():
    counter = [1,2,3,4,5,4,3]
    while 0 not in counter:
        sum = rand5() + rand5() - 2
        if sum <= 6:
            counter[sum] -= 1
    return counter.index(0) + 1

作为参考,下面的代码显示为创建随机分布。

test_counter = [0,0,0,0,0,0,0,0,0,0,0,0]
for i in range(500000):
    test_counter[rand5() + rand5() - 2] += 1

test_counter[0] *= 60
test_counter[1] *= 30
test_counter[2] *= 20
test_counter[3] *= 15
test_counter[4] *= 12
test_counter[5] *= 15
test_counter[6] *= 20
test_counter[7] *= 0
test_counter[8] *= 0

print(test_counter)

概率的解释:掷骰子的概率可以通过列出骰子的可能组合来计算。对于此问题,每个 die (rand5函数)生成的数字将是:

{(1,1),(1,2),(1,3),(1,4),(1,5),(2,1),(2,2),..., (5,5)}

每个和的概率是该和在列表中出现的方式的数量除以列表中项目的总数。该列表有5 ^ 2 = 25个元素。例如,通过以下组合{(1,3),(2,2),(3,1)}可以得出4的和,因此4的和的概率是3/25。

每个结果的概率为:

  1. 1/25
  2. 2/25
  3. 3/25
  4. 4/25
  5. 5/25
  6. 4/25
  7. 3/25
  8. 2/25
  9. 1/25

我试图使用此分布来生成均匀分布,因为必须将更常见的分布生成多次,并将其存储在计数器中。

1 个答案:

答案 0 :(得分:1)

不确定通过骰子分发是个好主意。通常,如果您具有随机位源,但序列较短,则最好将位组合并斩波以组成更长的随机位序列。沿线

import random

def rand5():
    return random.randint(1, 5)

def twobits():
    q = rand5() - 1 # [0...5) range
    while q == 4: # dropping high bit
        q = rand5() - 1
    return q # [0...3) range, two random bits

def onebit():
    return twobits() & 1

def rand7():
    q = onebit() << 2 | twobits() # here we have [0...8) range
    while q == 0:                 # and dropping 0
        q = onebit() << 2 | twobits()
    return q

counter = 8*[0]

for i in range(500000):
    counter[rand7()] += 1

print(counter)

在[1 ... 8)采样中产生的制服

[0, 71592, 71352, 71071, 71543, 71600, 71388, 71454]

从一个样本中取出两位,从另一个样本中取出一位,将它们组合在一起,有些拒绝和瞧!