在过去的几个小时里,我一直在尝试写一个牛和公牛计划。在牛和公牛。该程序应该生成0到9之间的4个非重复整数供用户猜测,但我的程序输出一组整数,其中一些重复值约为10次。我去过的每个人都没有发现任何错误,如果你知道修复请帮助我。到目前为止,我的计划如下:
Random rng = new Random();
int pos1 = rng.nextInt(10);
int pos2 = rng.nextInt(10);
int pos3 = rng.nextInt(10);
int pos4 = rng.nextInt(10);
int norepeat = 0;
while(norepeat == 0){
if(pos1 == pos3 || pos1 == pos2 || pos1 == pos4){
pos4 = rng.nextInt(10);
}
if(pos2 == pos1 || pos2 == pos3 || pos2 == pos4){
pos2 = rng.nextInt(10);
}
if(pos3 == pos1 || pos3 == pos2 || pos3 == pos4){
pos3 = rng.nextInt(10);
}
if(pos4 == pos3 || pos4 == pos2 || pos4 == pos1){
pos4 = rng.nextInt(10);
}
else {
norepeat = 1;
}
}
System.out.print(pos1);
System.out.print(" " + pos2);
System.out.print(" " + pos3);
System.out.print(" " + pos4);
答案 0 :(得分:3)
这就是我的所作所为。运行此代码后,您将拥有一组四个不同的整数,范围为0-9。
Random rng = new Random();
Set<Integer> numbersFound = new HashSet<>();
while(numbersFound.size() < 4) {
numbersFound.add(rng.nextInt(10));
}
这是有效的,因为Set
接口的实现强制实现唯一性。在集合中添加一个数字,当它已经在那里时,没有效果。
答案 1 :(得分:2)
问题在于:
if(pos1 == pos3 || pos1 == pos2 || pos1 == pos4){
pos4 = rng.nextInt(10);
}
if(pos2 == pos1 || pos2 == pos3 || pos2 == pos4){
pos2 = rng.nextInt(10);
}
if(pos3 == pos1 || pos3 == pos2 || pos3 == pos4){
pos3 = rng.nextInt(10);
}
if(pos4 == pos3 || pos4 == pos2 || pos4 == pos1){
pos4 = rng.nextInt(10);
}
else {
norepeat = 1;
}
else
的最后一个只有if
。这意味着如果它们是重复的,它将为前三个位置生成一个新值,但不会返回并检查新值是否仍然是重复的,除非第四个pos
也恰好是重复的。此外,您的第一个if
集pos4
代替pos
。将您的代码更改为:
if(pos1 == pos3 || pos1 == pos2 || pos1 == pos4){
pos1 = rng.nextInt(10);
} else if(pos2 == pos1 || pos2 == pos3 || pos2 == pos4){
pos2 = rng.nextInt(10);
} else if(pos3 == pos1 || pos3 == pos2 || pos3 == pos4){
pos3 = rng.nextInt(10);
} else if(pos4 == pos3 || pos4 == pos2 || pos4 == pos1){
pos4 = rng.nextInt(10);
}else {
norepeat = 1;
}
如果其中任何一个重复,它将重复。
答案 2 :(得分:1)
如果您想知道如何实现my comment states,则以下代码显示了如何。
public static void main (String[] args) {
// declare and populate a size 10 array of 0 - 9
int[] a = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
// shuffle the array 'a'
shuffleArray(a);
// output the first four indices of 'a'
System.out.printf("%d%d%d%d%n", a[0], a[1], a[2], a[3]);
}
// method used to shuffle a passed in array 'ar' using the Durstenfeld shuffle
public static void shuffleArray(int[] ar) {
Random rnd = new Random();
for (int i = ar.length - 1; i > 0; --i) {
int index = rnd.nextInt(i + 1);
// simple swap
int tmp = ar[index];
ar[index] = ar[i];
ar[i] = tmp;
}
}
只需交换四次,您就可以提高上述代码的效率,因为您只需要四个数字。然后你需要获取数组的最后四个索引,而不是前四个索引,因为数组从一端到另一端被洗牌。
如果您感到好奇,可以点击Durstenfeld shuffle链接。
答案 3 :(得分:0)
每次你的
if(pos4 == pos3 || pos4 == pos2 || pos4 == pos1){
pos4 = rng.nextInt(10);
}
发现不是执行else语句中的代码的情况。 解决这个问题的一种方法就是在他的回答中做补偿。
然而,另一种可能的解决方案是用以下
替换else语句 if(pos4!=pos1 && pos4!=pos3 && pos4!=pos2 && pos3!=pos2 && pos3!= pos1 && pos2!=pos1){
norepeat = 1;
}
这将每次检查值,并且只在数字不同时退出循环,同时保持大部分代码的正确性。
答案 4 :(得分:0)
我发现我的所有if语句同时运行。自从重写以来它们按顺序运作。下面是更新源:
Random rng = new Random();
int pos1 = 123;
int pos2 = 458;
int pos3 = 143;
int pos4 = 234;
int norepeat = 0;
pos1 = rng.nextInt(10);
pos2 = rng.nextInt(10);
while(norepeat == 0){
if(pos2 == pos1){
pos2 = rng.nextInt(10);
}else{
pos3 = rng.nextInt(10);
if(pos3 == pos1 || pos3 == pos2){
pos3 = rng.nextInt(10);
}else{
pos4 = rng.nextInt(10);
if(pos4 == pos1 || pos4 == pos2 || pos4 == pos3){
pos4 = rng.nextInt(10);
}else{
norepeat = 1;
答案 5 :(得分:0)
在我的GCSE作为我的模拟器后,我发现了random.sample,您可以使用它来创建一个没有重复的四位数系列。
str(random.sample(range(9), 4))
不幸的是,你将不得不使用多个&#34; .replace&#34;命令摆脱各种方括号,逗号和空格。