Цикл для генерации 6 неравных чисел не работает (Java) - PullRequest
1 голос

У меня здесь следующий код:

    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) будет выполнено и, следовательно, оно выйдет из цикла и сгенерирует новое число, но это не случилось, он прошел прямо и считал это действительным значением. </p>

Я уже целый день ломаю голову над этой проблемой и уже не могу найти решение, и это происходит примерно в 10% случаев, поэтому это не было изолированным случай.

Я попытался посмотреть на соотношение «j vs i», как в «Всегда ли повторяющееся число близко к предыдущему», но в некоторых исполнениях повторяющееся число будет обозначено цифрами [0] и цифрами [5], и в других это может быть как цифры [0] и цифры [1], поэтому тезис не работает.

Я также пытался изменить условие с && на ||, но получил его даже немного.

Я пробовал также несколько различных синтаксисов условий, например, идти в противоположном направлении (используя ложные выражения вместо истины), а также разные циклы вместо Do-While, но все равно не повезло.

Итак ... какая помощь здесь?

Ответы [ 4 ]

2 голосов
/ 20 мая 2019

Вам нужно изменить цикл do-while на

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

Ваш код выходит из цикла, только когда встречается первое не равное число.Вместо этого предположим, что числа не равны, и выйдите из цикла, когда встречается повторное число.

2 голосов
/ 20 мая 2019
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 == Numberros [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)

1 голос
/ 20 мая 2019
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
1 голос
/ 20 мая 2019

Ваш код сложнее, чем нужно. У вас есть дополнительный цикл, который, кажется, заканчивается слишком рано. Вот более простой подход:

    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;
        }
    }
...