我已经阅读了很多关于这个主题的帖子,但我对找到的内容并不满意。
我有一个对象列表,我们称之为“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。
同样只是为了提供更多背景,我的真正价值观是长期的。
答案 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的随机数。