如何从不同的元素数组中随机选择

时间:2014-02-21 00:27:06

标签: java arrays random boolean

我的问题很简单: 我有一组24个布尔值,我最初设置为假。我可以用代码随机选择这个数组的元素:

Random r = new Random();
int i1=r.nextInt(24);

现在我不时地将一些元素的值更改为true,让我们更改为元素编号14和22.我现在如何随机选择仅在仍然为假的其他元素之间随意选择真正?提前谢谢您的回答。

编辑: 工作的代码是:

Random r = new Random ();
int rand = r.nextInt (24);

while (array[rand]) {
          rand = r.nextInt (24);

        }

3 个答案:

答案 0 :(得分:0)

例如,您可以跟踪元素在true中具有值ArrayList的索引。生成随机数时,检查它是否等于已经true个数字之一(应该从随机数生成/选择中排除)并重新生成一个随机数,直到得到一个数组索引它仍在false

答案 1 :(得分:0)

int numberTrue=0; //adjust this in your other code accordingly
Random r = new Random ();
int rand = r.nextInt (24);
// loop until not true found or stop if all items are true
while (array [rand] && numberTrue < 24) {
  rand = r.nextInt (24);
  count++;
}

我想了一下,在不知道你的代码的情况下,这里有一些建议,以避免无限循环,当它们都是真的时(假设条件可能存在):
1.记录设定的真实数量(例子为此调整)
2.按照另一个答案中的建议存储第二个真实索引数组

第一个可能是最简单的实现(在适当的代码点添加numberTrue++;numberTrue--;) - 这里只是一个注释,如果不能保持这个数,那么你通过在数组上运行一个初始for循环并计算真实元素的数量,可以实现同样的目的。
第二种方式可以利用另一篇文章中的一个答案:

public int generateRandom(int start, int end, ArrayList<Integer> excludeRows) {
    Random rand = new Random();
    int range = end - start + 1;

    int random = rand.nextInt(range) + 1;
    while(excludeRows.contains(random)) {
        random = rand.nextInt(range) + 1;
    }

    return random;
}

(我相信他们的代码实际应该是rand.nextInt(range) + start 所以你会跑:

if (trueIndexes.length < 24) {
      generateRandom(0, 23, trueIndexes);
    }

答案 2 :(得分:0)

您可以创建具有“false”的布尔元素列表,并随机选择此列表的元素。