1

我想知道在以下情况下,哪种方法是最简单、最可配置的方法来获得我需要的东西:

  • 我有一个计数器,我们称之为它将X用于提取其中一组
  • 我有可变数量的集合S1, S2, ..,它们可以被认为是它们之间的总排序
  • 我想以一种模糊的方式混合这些集合,这样X = 0它会给我S1,比如说,X = 20它会给我S170% 的机会,以及S230% 的机会
  • 增加X将降低概率S1直到 0%,同时增加到S2100%,然后可能会有一个区域,它会一直给我S2 ,直到一个新的阈值S2开始减少并S3开始获得它的机会等等

我知道如何通过对所有内容进行硬编码来做到这一点,但由于它需要一些调整,我想应用一个解决方案,该解决方案可以轻松配置我拥有的集合数量和单个阈值(增加概率的开始/结束和开始/结束减少概率)。当然,我不需要每组超过 2 组之间的任何交集,并且概率的线性增加/减少是可以的.. 有什么好的线索吗?

提前致谢!

4

1 回答 1

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
于 2011-06-25T02:29:06.863 回答