选择具有双重偏差的随机项目

时间:2011-06-07 10:19:08

标签: java random

我已经阅读了很多关于这个主题的帖子,但我对找到的内容并不满意。

我有一个对象列表,我们称之为“L”。

“L”有两个属性,“L.small”和“L.big”。

我想选择一个随机的“L”,但是偏向选择,这样我就更有可能选择具有较低“L.small”和较高“L.big”的对象。所以只是为了说清楚,它是低“L.small”和高“L.big”的组合,使对象更具吸引力。

以下是一个例子:

可以说最大可能L.small为50.最大L.big为1000,000。因此,L.small是一个随机的小值范围,L.big是一个随机的大值范围。

L1.small = 1 //最好的.small

L1.big = 1000,000 //最好的.big

L2.small = 50 //最不可取的.small

L2.big = 1 //最不可取的.big

L3.small = 25 //非常平均

L3.big = 500,000 //相当平均

在这个例子中,最有可能选择L1,最不可能选择L2,中间使用L3。

同样只是为了提供更多背景,我的真正价值观是长期的。

2 个答案:

答案 0 :(得分:2)

编辑:好的,我误解了这个问题。您使用的确切算法取决于您希望事物偏向的方式。例如,您可以有效地将每个对象视为具有big - small的“权重”...然后将列表中项目的所有权重相加:

int totalWeight = 0;
for (Foo foo : list)
{
    totalWeight += foo.getWeight();
}

// As usual, normally you'd reuse an existing instance
Random rng = new Random();
int value = rng.nextInt(totalWeight);

// Pick an item based on the random value we've chosen
for (Foo foo : list)
{
    if (value < foo.getWeight())
    {
        return foo;
    }
    value -= foo.getWeight();
}

答案 1 :(得分:0)

如果我理解正确,您希望生成具有非均匀概率密度函数(PDF)的随机变量?如果是这样,您可能会对inverse transform sampling感兴趣,它允许您将均匀分布的随机数(例如,您可能从java.util.Random获得)转换为具有任意PDF的随机数。