这里有一点点数学.
常规骰子将给出每个数字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)
更多语言不可知,但您可以使用查找表.
使用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
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