用于选择阵列中半随机项的伪随机算法

时间:2011-12-07 00:09:26

标签: arrays algorithm random indexing

我有一个简单的数组(或者如果你愿意,可以设置)整数,我们称之为X.我还有另一个数组W,用于存储数组X中元素的“权重”。“权重”表示n-的可能性应选择th元素。现在我需要一种方法(算法)来(伪)根据数组W中定义的“权重”从数组/集合X中随机选择一个元素。

例如,如果我的W看起来像这样:     W [0] = 2;     W [1] = 4;     W [2] = 6;

表示从数组X中选择第N项的概率为:     X [0] = 16.6%     X [1] = 33.3%     X [2] = 50%

所以方法get_pseudorandom_item(X)应该在大约一半的时间内返回第二项。

如何实现这一点(以任何编程语言)的任何想法或建议都非常感谢。 感谢。

4 个答案:

答案 0 :(得分:7)

  1. 使用权重的部分总和生成数组 P ,即

    P 0 = W 0 ),( P 1 = W 0 + W 1 ),...,( P n = W 0 + W 1 + ... + W n

    (你可以在 W 内做到这一点,实际上,如果你之后不需要权重)。

  2. 在[0, P n )中生成随机数 r ,其中 P n 表示最后一个这样的总和(即所有权重的总和)。

  3. 找到最小(第一个)部分和更大的索引 k ,而不是您生成的数字

    P k > r ∧∀ a < k P a < - [R

  4. 使用该索引选择您的实际元素: X k

答案 1 :(得分:1)

我们假设X[]中的数字加起来为1.0。因此X[2]将是0.5000

你选择你的号码并添加,直到你'没有机会'。

这是一个Java示例:

double rand = random.nextDouble();
double sofar = 0.0;

for(int i = 0; i < X.length; x++) {
    if(sofar + X[i] > rand) return W[i];
    sofar += X[i];
}
throw new IllegalStateException("Numbers add up to less than 1");

答案 2 :(得分:1)

对于每个对象类型x [i]其中y是它的权重。在x [i]类型的数组中添加y元素。

然后从这个数组中随机选择。

以你的例子为例,你将在集合中有2 W [0],4 W [1]和6 W [2],你可以从中随机选择一个类型为0,1或2的项目。

答案 3 :(得分:0)

我想到的第一件事并不是一个非常漂亮的解决方案,但无论如何我都会分享它!

您可以创建另一个数组(例如100个整数)。 每个整数代表 W 中的索引。 根据给定的百分比,您可以用整数填充该数组。

所以如果你有X [0] = 25%X [1] = 25%X [2] = 50% 阵列将有25个1,25个2和50个3

然后你可以选择该数组的伪随机索引,并使用返回的索引来检索 W 中的对象。

就像我说的那样,它很难看,但它会起作用:)