我想知道哪种是最简单,最可配置的方式,可以在以下情况下获得我需要的东西:
X
,用于提取其中一组S1, S2, ..
,它们之间可以被视为total ordered X = 0
它会给我S1
,因为,我会说X = 20
它会给我S1
有70%的几率,S2
有30%的几率X
会将S1
的概率降低到0%,同时将S2
增加到100%,然后可能会有一个区域,它总是会给我S2
}
直到S2
开始减少并且S3
将开始获得机会等等的新阈值我知道如何通过对所有内容进行硬编码来实现,但由于需要进行一些调整,我想应用一个解决方案,它可以让我轻松配置我拥有的套数和单个阈值(增加概率的开始/结束)减少概率的开始/结束)。当然,我不需要每组超过2组之间的任何交叉,并且概率的线性增加/减少是好的..任何好的线索?
提前致谢!
答案 0 :(得分:1)
要分配概率的分布,可以使用Bernstein多项式:
http://en.wikipedia.org/wiki/Bernstein_polynomial
使用de Casteljau的算法可以有效地计算这些算法(基本上它以递归方式显示DP):
http://en.wikipedia.org/wiki/De_Casteljau“s_algorithm
http://www.cs.mtu.edu/~shene/COURSES/cs3621/NOTES/spline/Bezier/de-casteljau.html
您获得的结果将是分布上的一组权重。要选择一个集合,只需在[0,1]中生成一个统一的随机变量,然后根据这些权重选择它所着的集合。
这是python中的一些代码:
import random
#Selects one of the n sets with a weight based on x
def pick_a_set(n, x):
#Compute bernstein polynomials
weights = [ [ float(i == j) for j in range(n) ] for i in range(n) ]
for k in range(n):
for j in range(n-k-1):
for i in range(n):
weights[j][i] = weights[j][i] * (1.0 - x) + weights[j+1][i] * x
#Select using weights
u = random.random()
for k in range(n):
if u < weights[0][k]:
return k
u -= weights[0][k]
return 0