首页 > 解决方案 > 生成 6 个不相等数字的循环失败(java)

问题描述

我这里有以下代码:

    import java.util.Random;

    public class Main {
        public static void main(String[] args) {
            int numnovo, numeros[], j;
            boolean igual;
            numeros = new int[6];

            Random rand = new Random();

            numnovo = rand.nextInt(60)+1;
            numeros[0] = numnovo;

            System.out.println("Número 1: " + numeros[0]);

            for(int i = 1; i < 6; i++)
            {
                do
                {
                    igual = true;
                    numnovo = rand.nextInt(60)+1;
                    j=0;
                    while(j<=i && igual)
                    {
                        igual = (numnovo == numeros[j++]);
                    }
                }while(igual);
                numeros[i] = numnovo;
                System.out.println("Número " + (i+1) + ": " + numeros[i]);
            }
    }
}

所以,这是我从中得到的结果之一:

numeros[0]=48 
numeros[1]=31
numeros[2]=52
numeros[3]=25 - repeated
numeros[4]=18
numeros[5]=25 - repeated

然而,在分析代码时,我想它会在循环内部出现以下情况:

i=5

j=0 numeros[0]=48   false
j=1 numeros[1]=31   false
j=2 numeros[2]=52   false
**j=3   numeros[3]=25   true**

特别是在标记的行中,我假设满足 while 循环 (j<=i && igual) 的条件,因此,它将退出循环并生成一个新数字,但这并没有发生,它直接通过并认为它是一个有效值。

我已经为这个问题绞尽脑汁大约一天了,但找不到解决方案,而且这发生在大约 10% 的执行中,所以这不是一个孤立的案例。

我试图研究“j vs i”关系,如“重复的数字是否总是接近前一个”,但在某些执行中,重复的数字将是 numeros[0] 和 numeros[5],而在其他情况下它可能像 numeros[0] 和 numeros[1],所以论文没有用。

我也尝试将条件从 && 更改为 ||,但得到的却一点也没有改变。

我还尝试了一些不同的条件语法,如朝着相反的方向前进(使用错误语句而不是真),以及不同的循环而不是 Do-While,但仍然没有运气。

所以...这里有什么帮助吗?

标签: javaloopsrandomboolean

解决方案


while(j<=i && igual)
{
    igual = (numnovo == numeros[j++]);
}

你第一次停止一个数字不相等,所以在你的例子中,你只检查第一个数字是否相等。

在这种情况下,您通常想尝试相反的方法:

do {
    boolean found = false;
    numnovo = rand.nextInt(60)+1;
    j=0;
    while (j<=i){
        if (numnovo == numeros[j++]){
            found = true;
        }
    }
}while(found);

从评论中

这个想法是不在代码中使用任何 if,这就是为什么我使用语法 igual = (numnovo == numeros[j++])

在这种情况下,您可以尝试:

do {
    boolean found = false;
    numnovo = rand.nextInt(60)+1;
    j=0;
    while (j<=i){
        found = numnovo == numeros[j++] || found;
    }
}while(found);

或者,就像@nullptr 的回答一样,从循环中中断:while (j<=i && !found)


推荐阅读