Я использую Matlab для написания этого кода, и кажется, что с логикой что-то не так, но я не знаю, где я ошибаюсь и как это исправить.

Я хочу написать код лото, и в нем шесть чисел, диапазон первых шести чисел от 1 до 38, диапазон последнего числа от 1 до 8. Вот мой код

previous_number=randi([1,38],1,6)
last=randi([1,8],1,1) %produce the last number

for k =1:6    
    while  last== previous_number %while that last number is the same as the value of one of the previous number
    last=randi([1,8],1,1)%then produce the last number again,until the different value produce
    end
end
ltto=[previous_number last]

Но я обнаружил, что последнее число по-прежнему будет генерировать то же число, что и первые шесть чисел, например,

«1» 2 33 55 66 10 «1»

1 "2" 33 55 66 10 "2"
Почему? Я уже сказал

while  last==previous_number(k)
    last=randi([1,8],1,1)
    end   

Если я хочу написать код на c или другом программном языке, я думаю, что могу просто использовать if, while, loop и т. д., как этот базовый цикл, я не могу использовать ismemeber или randperm. как я могу переписать код?

Если я перепишу как

previous_number=randi([1,38],1,6)
last=randi([1,8],1,1) %produce the last number

for k =1:6    
    if  last== previous_number(k) %while that last number is the same as the value of one of the previous number
    last=randi([1,8],1,1)%then produce the last number again,until the different value produce
    end
end
ltto=[previous_number last]

Результат также иногда показывает мне "1" 2 21 12 13 22 "1"

0
Shine Sun 9 Мар 2019 в 14:26

1 ответ

Лучший ответ

Это происходит потому, что вы сначала перебираете числа, а затем заменяете last в соответствии с конкретной текущей итерацией, без учета предыдущих.

Например, в данных вашего примера представьте, что last = 10, чтобы перейти к шестой итерации, обнаружите, что last равно b(k), то есть 10, и замените его. Но теперь он может генерировать 1, и вы завершите цикл while и цикл for.

Решение состоит в том, чтобы сравнить last со всем вашим вектором, а не повторять его:

previous_number = b(1:6);
last = previous_number(1);
while ismember(last, previous_number)
    last = randi(8); %produce the last number
end

[На момент обсуждения комментариев:]

Если вы все же хотите сравнить каждый элемент отдельно, вы можете сделать это так:

previous_number=randi([1,38],1,6)
last=randi(8) 
k=0;

while k <= 5   
    k = k + 1;
    if last == previous_number(k)
        last = randi(8);
        k = 0;
    end
end
ltto=[previous_number last]
1
Adiel 12 Мар 2019 в 07:23