【问题标题】:Loop for generating 6 non-equal numbers is failling (java)生成 6 个不等数的循环失败(java)
【发布时间】:2019-10-06 09:37:05
【问题描述】:

我这里有以下代码:

    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

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

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

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

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

那么...这里有什么帮助吗?

【问题讨论】:

  • 一点建议,把变量名改成英文会帮助很多人更好地帮助你
  • 我猜你可以使用Set?

标签: java loops random boolean


【解决方案1】:
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);

来自cmets

这个想法是不在代码中使用任何 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&lt;=i &amp;&amp; !found)

【讨论】:

  • 感谢您的帮助!有效!我只是没有更好地理解我的循环只是检查第一个数字是否相等的想法。请您解释一下好吗?
  • @LuizHenriqueCarneiroGonalve 如果第一个数字不相等,则 iqual = false,因此您的循环中断。所以 25 != 48?没错,所以你结束了你的循环 (&amp;&amp; iqual == false)
  • 但实际上,您想检查所有其他数字,因此您希望循环继续
  • @LuizHenriqueCarneiroGonalve 添加到您的其他 cmets 的回复中
【解决方案2】:

您必须将 do-while 循环更改为

do
{
    igual = false;
    numnovo = rand.nextInt(60)+1;
    j=0;
    while(j<=i && !igual)
    {
        igual = (numnovo == numeros[j++]);
    }
}while(igual);

只有在遇到第一个不相等的数字时,您的代码才会退出循环。相反,假设数字不相等,并在遇到重复数字时退出循环。

【讨论】:

  • 这里提供的两种解决方案,你和火星都有效!谢谢!
【解决方案3】:

您的代码比它需要的更复杂。您有一个似乎过早终止的额外循环。这是一个更简单的方法:

    for(int i = 0; i < nums.length;) {
        int randomNum = r.nextInt(6);
        boolean equal = false;
        for(int j = 0; j < i; j++) {
            int arrNum = nums[j];
            if(arrNum == randomNum) {
                equal = true;
                break;
            }
        }

        if(!equal) {
            nums[i++] = randomNum;
        }
    }

【讨论】:

  • 这个想法是不要在代码中使用任何 if,这就是为什么我使用语法 igual = (numnovo == numeros[j++]);不过,感谢您的帮助!它也有效:)
  • 好吧,抱歉。
【解决方案4】:
igual = false; // default no repeat;
numnovo = rand.nextInt(60)+1;
j=0;
while(j<=i && !(igual = (numnovo == numeros[j++]))); // if repeat break inline loop and generate a new number

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-12
    • 1970-01-01
    • 2014-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多