当前位置:  开发笔记 > 编程语言 > 正文

如何在python中模拟偏置模?

如何解决《如何在python中模拟偏置模?》经验,为你挑选了3个好方法。



1> Yuval Adam..:

这里有一点点数学.

常规骰子将给出每个数字1-6的概率相等,即1/6.这被称为均匀分布(它的离散版本,而不是连续版本).这意味着if X是一个描述单个角色结果的随机变量X~U[1,6]- 意味着X对于掷骰子的所有可能结果,1到6平均分配.

这相当于在选择数目[0,1)而将其分成6个部分:[0,1/6),[1/6,2/6),[2/6,3/6),[3/6,4/6),[4/6,5/6),[5/6,1).

您正在请求不同的分发,这是有偏见的.实现这一目标的最简单方法是[0,1)根据您想要的偏差将该部分分为6个部分.所以你的情况,你会想要将它划分为如下: [0,0.2),[0.2,0.4),[0.4,0.55),0.55,0.7),[0.7,0.84),[0.84,1).

如果你看一下维基百科条目,你会发现在这种情况下,累积概率函数不会由6个等长部分组成,而是6个部分,根据你给出的偏差,它们的长度不同.质量分布同样如此.

回到问题,根据您使用的语言,只需将其转换回您的掷骰子.在Python中,这是一个非常粗略但虽然有效的例子:

import random
sampleMassDist = (0.2, 0.1, 0.15, 0.15, 0.25, 0.15)

# assume sum of bias is 1
def roll(massDist):
    randRoll = random.random() # in [0,1)
    sum = 0
    result = 1
    for mass in massDist:
        sum += mass
        if randRoll < sum:
            return result
        result+=1

print roll(sampleMassDist)



2> Toon Krijthe..:

更多语言不可知,但您可以使用查找表.

使用0-1范围内的随机数并在表中查找值:

0.00 - 0.20   1
0.20 - 0.40   2
0.40 - 0.55   3
0.55 - 0.70   4
0.70 - 0.84   5
0.84 - 1.00   6



3> nosklo..:
import random

def roll(sides, bias_list):
    assert len(bias_list) == sides
    number = random.uniform(0, sum(bias_list))
    current = 0
    for i, bias in enumerate(bias_list):
        current += bias
        if number <= current:
            return i + 1

偏见将成比例.

>>> print roll(6, (0.20, 0.20, 0.15, 0.15, 0.14, 0.16))
6
>>> print roll(6, (0.20, 0.20, 0.15, 0.15, 0.14, 0.16))
2

也可以使用整数(更好):

>>> print roll(6, (10, 1, 1, 1, 1, 1))
5
>>> print roll(6, (10, 1, 1, 1, 1, 1))
1
>>> print roll(6, (10, 1, 1, 1, 1, 1))
1
>>> print roll(6, (10, 5, 5, 10, 4, 8))
2
>>> print roll(6, (1,) * 6)
4

推荐阅读
谢谢巷议
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有