从离散分布中抽样,同时考虑过去的事件

时间:2014-07-09 16:23:20

标签: algorithm language-agnostic

我有一个需要从中进行采样的离散分布。它严重偏斜,一个例子如下

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样本采样的完全相同的值。上下文是他们在我正在建立的游戏中的加电。我希望通电是随机的,但不能反复向玩家发出相同的通电。

是否有任何方法将过去出现的样本合并为生成值,或者我必须重复采样直到得到我更喜欢的值?

1 个答案:

答案 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++];
    }

}