2011-05-03 40 views
2

加权比方说,我有ň对象的集合,而且每个对象都有与之相关联的排名,而这些排名通过ň对应的整数值1。随机选择,按职级

现在假设我想从集合中随机选择一个对象。但我不想随便选一个从1到n的数字;相反,我想这样做的目的是让我更有可能在名单上选一个更高的数字(排名接近1)。

提议的解决方案:而不是从1到采摘Ñ,挑从1到,其中是一些数显著大于Ñ;然后使用一些映射功能f:[1,m]→[1,n],其将较多数字映射到较高等级而不是较低等级。例如,˚F(1),˚F(2),˚F(3)可能所有返回1,而˚F(m)为映射到Ñ唯一的一个,因此它为三次数更可能得到1比n。希望这是有道理的。

所以我的问题是:如果这似乎是一个合理的算法,什么是合理的功能˚F完成此,并且什么比米/ N将足够大,整数四舍五入并不妨碍人数从永远被采摘?

[在我的特殊情况下,n可能相当大(数以千计),所以像here这样的解决方案对于这种情况不太实际。此外,选择是“与替换”;即我选择一个对象一次然后返回;我不在乎下一次是否立即再次选取它。]

+0

看到这个答案:http://stackoverflow.com/questions/1761626/weighted-random-numbers/1761646#1761646 – 2011-05-03 16:00:12

回答

2

你可以做类似如下:

double bias = 1.5; 
int index = (int)(n * (bias - sqrt(bias*bias -4.0*(bias-1.0)* random())) 
       /2.0/(bias-1)); 

改变偏置参数让你控制强烈支持较高等级的人。

编辑:下面是它的一些Python代码。

def pick(n, bias): 
    return int(n * (bias - sqrt(bias*bias -4.0*(bias-1.0)*random()))/2.0/(bias-1)) 

vals = [0]*10 
for i in xrange(1000): 
    vals[pick(10,1.5)] += 1 
print vals 
[153, 151, 115, 116, 97, 96, 87, 69, 66, 50] 
+1

出于好奇,你是怎么想出这个公式的?我不怀疑它是否有效,但对于我为什么它能正常工作并不是很明显。 – 2011-05-03 16:19:01

+1

我没有。我的研究生顾问开发了一种算法,这个算法需要在几年前完成(1989年是确切的,算法是一个称为Genitor的GA)。我意识到相同的要求,并将代码拉到该算法。 :) – deong 2011-05-03 16:25:15

0

按等级标准化,然后构建二叉树。选择一个随机double并找到相应的值。

1

我会尝试使用正态随机方法(random.uniform(0, 1)),但平方概率。

由于P{x}的范围是0 -> 1,P {x^2} also ranges from 0 - > 1`。

但重量是不均匀的,作为平方少数还小,和平方更大数量变小。

只是一个想法。

+0

这是一个好主意......事实上,任何函数x^y的工作范围从0到1,因为对于所有y,0^y = 0和1^y = 1。 – 2011-05-03 16:06:03

+0

你有很多选择;) – Blender 2011-05-03 16:07:48

0

我想你真正想要的是功能˚F:1,ñ]→ñ(自然数0,1,2,...)。这将为每个等级分配一个权重。那么你想挑选排名k的概率为f(* k *)/(Σf(* i *)),换句话说,就是所有排名的权重之和的排名权重。要做到这一点,你可以简单地在整个区间[1,Σ(* i *)]随机抽取一个整数,根据你的位置计算出你的排名;如果你是在1 ... ˚F(1),挑1,如果你是在˚F(1)+1 ... ˚F(1)+ ˚F(2),挑2,等等。对于˚F其权重小的程度比大级别更高

一个可能的选择是˚F(* I *)= ñ - + 1,还有许多其他可能的选择。

1

从区间1..n(K> 1)中生成K个随机数并选择最小值!

这有你想要的属性,检查了分布的示范在http://www.sjsu.edu/faculty/watkins/samplemin.htm

为了与K(1 <ķ< 2)的分数值这个工作,你可以做这样的:

int m = random_int(1..n) 
if (random_double(0..1) <= K - 1): 
    m = min(m, random_int(1..n)) 

所以当K从上方接近1时,分布变得越来越平坦。

+0

不是一个坏建议,但我认为K = 2的曲线甚至可能对我的需求来说太陡。 – 2011-05-03 17:26:13

+0

好吧,添加一个解释如何为小数值1 2011-05-03 17:34:35

+0

当然!非常好,谢谢。 – 2011-05-03 17:39:54