我有以下代码在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个值设置为随机。如果尚未获取值,我需要构建一个检查器。如果它已经被采用,那么它需要重做随机化。但我不知道该怎么做。有人能帮助我吗?
答案 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;
}