我的问题很简单: 我有一组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);
}
答案 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”的布尔元素列表,并随机选择此列表的元素。