Код лотереи, предыдущий номер не может появиться снова, как мне это улучшить

#matlab #random

#matlab #Случайный

Вопрос:

Я использую 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 и цикл и т.д., Как этот базовый цикл, я не могу использовать «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» иногда

Комментарии:

1. Не используйте случайные теги

2. @Lightness: с другой стороны, тег [random] оправдан. 😀

3. @CrisLuengo Пунктуально 😀

Ответ №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. я просто немного смущен этим, но я пишу ‘while (last ==previous(k))’, разве это не означает, что когда последний == один из элементов в предыдущем, разве это не означает «сравнить со всеми элементами в векторе»? Если нет, я также использую «if» вместо «while», оно также должно иметь значение сравнения, но результат тот же, что и while

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

3. previous(k) является скалярным, а не векторным, поэтому его можно сравнивать только с определенным скаляром. Я не знаю, как C относится к изменению итератора, но концептуально вы должны заменить while на if , и если оно равно, и вы генерируете новое случайное число, вам нужно вернуться к первому элементу и начать все сравнения заново, поэтому внутри if вставки также k=1

4. previous_number= randi([1,38],1,6) last = randi([1,8],1,1) % создайте последнее число для k = 1: 6, если last== previous_number(k) %, в то время как это последнее число совпадает со значением одного из предыдущих чисел last = randi([1,8],1,1)% затем снова введите последнее число, пока другое значение не выдаст end end ltto=[previous_number last] результат также покажет мне «1» 2 21 12 13 22 «1» иногда

5. я отредактировал вопрос, но результат не стал лучше