我有一个需要从中进行采样的离散分布。它严重偏斜,一个例子如下
a - 1-40
b - 40-80
c - 80-85
d - 85-90
e - 90-95
f - 95-100
要从此分布中进行当前采样,我在[1,100]
区间选择一个随机数并选择相应的值。
但是,我想确定如果我看到[c,d,e,f]
中的一个,我看不到为下一个x样本采样的完全相同的值。上下文是他们在我正在建立的游戏中的加电。我希望通电是随机的,但不能反复向玩家发出相同的通电。
是否有任何方法将过去出现的样本合并为生成值,或者我必须重复采样直到得到我更喜欢的值?
答案 0 :(得分:0)
执行此操作的一种方法是将包含值1-100的数组混洗,然后根据需要进行迭代。
例如,Java中的实现:
public class PowerUpSelector
{
private int current;
private int x;
private int[] distribution;
public PowerUpSelector(int x)
{
this.x = x;
current = 0;
distribution = new int[100];
for (int i = 0; i < distribution.length; i++)
distribution[i] = i;
shuffle(distribution[i]); //implement fisher-yates shuffle here.
}
public int returnPowerUpID()
{
if (current >= x)
{
shuffle(distribution);
current = 0;
}
return distribution[current++];
}
}