#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. я отредактировал вопрос, но результат не стал лучше