奶牛和公牛重复

时间:2016-10-07 20:19:26

标签: java random

在过去的几个小时里,我一直在尝试写一个牛和公牛计划。在牛和公牛。该程序应该生成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);

6 个答案:

答案 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也恰好是重复的。此外,您的第一个ifpos4代替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;命令摆脱各种方括号,逗号和空格。