Чтобы назначить распределение вероятностей, вы можете использовать полиномы Бернштейна:
http://en.wikipedia.org/wiki/Bernstein_polynomial
Они могут быть эффективно вычислены с использованием алгоритма де Кастельжау (в основном это делает 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