我想知道在以下情况下,哪种方法是获取我需要的最简单和最可配置的方法:
- 我有一个计数器,我们称它为
X
,它将用于提取其中一个集合 - 我有可变数量的集合
S1, S2, ..
可以考虑 total ordered他们之间 - 我想以一种模糊的方式混合这些集合,这样对于
X = 0
它将给我S1
,比方说,X = 20
它会给我S1
70% 的机会,S2
30% 的机会 - 增加
X
会将S1
的概率降低到 0%,同时将S2
增加到 100%,然后可以有一个区域,其中它总是给我S2
直到S2
开始下降并且S3
开始获得机会的新阈值,依此类推
我知道如何通过硬编码一切来做到这一点,但由于它需要一些调整,我想应用一个解决方案,它可以轻松地让我配置我有多少组和单个阈值(增加概率的开始/结束和减少概率的开始/结束)。当然,我不需要超过 2 个集合之间的任何交集,概率的线性增加/减少是可以的。有什么好的线索吗?
提前致谢!
最佳答案
要分配概率分布,您可以使用 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
关于algorithm - 可变数量的集合之间的模糊选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6475396/