我有一个简单的数组(或者如果你愿意,可以设置)整数,我们称之为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)应该在大约一半的时间内返回第二项。
如何实现这一点(以任何编程语言)的任何想法或建议都非常感谢。 感谢。
答案 0 :(得分:7)
使用权重的部分总和生成数组 P ,即
( P 0 = W 0 ),( P 1 = W 0 + W 1 ),...,( P n = W 0 + W 1 + ... + W n )
(你可以在 W 内做到这一点,实际上,如果你之后不需要权重)。
在[0, P n )中生成随机数 r ,其中 P n 表示最后一个这样的总和(即所有权重的总和)。
找到最小(第一个)部分和更大的索引 k ,而不是您生成的数字
P k > r ∧∀ a < k : P a < - [R
使用该索引选择您的实际元素: 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 中的对象。
就像我说的那样,它很难看,但它会起作用:)