Java中的非重复随机数生成器

时间:2015-05-27 17:02:20

标签: java random

我正在尝试在Java中创建一个不重复其输出的Random类的子类,这是我到目前为止所拥有的...

import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;

public class NonRepetitiveRandom extends java.util.Random {
    private Set<Integer> noUseInts = new CopyOnWriteArraySet<Integer>();
    private static final long serialVersionUID = 1L;

    @Override
    protected int next(int bits) {
        int i;
        for (i = super.next(bits); noUseInts.contains(i); i = super.next(bits))
            ;
        noUseInts.add(i);
        return i;
    }
}

没事吗?我需要添加任何东西吗?我最初尝试使用与上面相同的模型覆盖每个next *方法,但在注意到下一个方法本身在所有next *方法中使用后,我试图单独覆盖它。

注意: shuffling方法不起作用,因为它会创建一个完整列表并在每次需要值时将其随机播放。此外,如果范围很宽并且根本没有指定范围,则不实用。事实上,这种方法的唯一用例是当我已经有一个清单时。总之,非重复随机数发生器是最实用的解决方案。

1 个答案:

答案 0 :(得分:0)

看起来你的代码会产生你想要的输出。 但是,如果您计划将其用于许多代随机数,则必须搜索以查找下一个随机数的参数空间将继续减少。天真地,每次平均生成下一个随机数需要更长的时间,所以如果要生成许多数字,请注意这一点。