如何在python中模拟偏压die?

2024-05-18 18:57:32 发布

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

我想模拟N边偏压模具?

def roll(N,bias):
     '''this function rolls N dimensional die with biasing provided'''
     # do something
     return result

>> N=6
>> bias=( 0.20,0.20,0.15,0.15,0.14,0.16,)
>> roll(N,bias)
   2

Tags: defwithfunctionthisdosomethingprovidedroll
1条回答
网友
1楼 · 发布于 2024-05-18 18:57:32

这里有点数学。

一个普通的模具将以相同的概率给出每个数字1-6,即1/6。这称为uniform distribution(它的离散版本,而不是连续版本)。意思是,如果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)

如果你看一下wikipedia entry,你会发现在这种情况下,累积概率函数将不是由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楼 · 发布于 2024-05-18 18:57:32

更多的语言不可知,但你可以使用查找表。

使用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楼 · 发布于 2024-05-18 18:57:32
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

相关问题 更多 >

    热门问题