在生成数字对的随机列表时,如何避免重复?

时间:2012-01-21 19:09:30

标签: java arrays random

我有以下代码在boolean [] []:

中将10个随机值设置为true
    bommaker = new boolean[10][10];
    int a = 0;
    int b = 0;

    for (int i=0; i<=9; i++) {          

        a = randomizer.nextInt(9);
        b = randomizer.nextInt(9);
        bommaker[a][b] = true; 
    }

但是,使用此代码,可以生成相同的值,因此将少于10个值设置为随机。如果尚未获取值,我需要构建一个检查器。如果它已经被采用,那么它需要重做随机化。但我不知道该怎么做。有人能帮助我吗?

2 个答案:

答案 0 :(得分:6)

最简单的解决方案,而不是最好的解决方案:

for (int i=0; i<=9; i++) {          
    do {
        a = randomizer.nextInt(10);
        b = randomizer.nextInt(10);
    } while (bommaker[a][b]);

    bommaker[a][b] = true; 
}

答案 1 :(得分:4)

如果我没有弄错的话,你的问题类似于从卡片上随意抽取卡片......

但首先......以下内容:

randomizer.nextInt(9)

将不会执行您想要的操作,因为它将返回包含[0..8]之间的整数(而不是[0..9])。

以下是Jeff对洗牌主题的看法:

http://www.codinghorror.com/blog/2007/12/shuffling.html

要随机选择 x 点,您可以随机播放100个点并保留前10个点。

现在当然看到你只占所有拍摄地点的10%,如果已经拍摄的地点在合理的时间内也会有效,那么只需重试。

但是如果你要选择100个中的50个点,那么从[0..99]中移动一个列表并保持50个第一个值是最好的。

例如,这里是你如何用Java编写代码(现在如果速度是一个问题,你将使用基元数组和基元数组上的随机数):

    List<Integer> l = new ArrayList<Integer>();
    for (int i = 0; i < 100; i++) {
        l.add(i);
    }
    Collections.shuffle(l);
    for (int i = 0; i < n; i++) {
        a[l.get(i)/10][l.get(i)%10] = true;
    }