Pra*_*are 9 python numpy probability
我想模拟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
Run Code Online (Sandbox Code Playgroud)
Yuv*_*dam 26
这里有一点点数学.
常规骰子将给出每个数字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)
Run Code Online (Sandbox Code Playgroud)
Too*_*the 11
更多语言不可知,但您可以使用查找表.
使用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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
偏见将成比例.
>>> 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
Run Code Online (Sandbox Code Playgroud)
也可以使用整数(更好):
>>> 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
Run Code Online (Sandbox Code Playgroud)
小智 5
np.random.choice
这里没有给出答案,这有点令人惊讶。
from numpy import random
def roll(N,bias):
'''this function rolls N dimensional die with biasing provided'''
return random.choice(np.range(N),p=bias)
Run Code Online (Sandbox Code Playgroud)
该p选项使“与每一项目相关的概率一个,其中”一个是np.range(N)
我们。“如果没有给出,样本将假设在一个”中的所有条目上均匀分布。