#python
Вопрос:
import random
d = [0,0,0,0,0,0,0,0,0,0,0,0,0]
for i in range(1, 13):
d[i] = random.randint(0,10)
print(d)
for i in range(10):
perturbdp = random.randint(1,12)
d[perturbdp] = random.randint(0,10)
print(perturbdp)
print(d)
Выход:
[0, 3, 5, 1, 2, 2, 10, 0, 8, 0, 4, 8, 8]
8
[0, 3, 5, 1, 2, 2, 10, 0, 7, 0, 4, 8, 8]
10
[0, 3, 5, 1, 2, 2, 10, 0, 7, 0, 9, 8, 8]
9
[0, 3, 5, 1, 2, 2, 10, 0, 7, 2, 9, 8, 8]
10
[0, 3, 5, 1, 2, 2, 10, 0, 7, 2, 6, 8, 8]
12
[0, 3, 5, 1, 2, 2, 10, 0, 7, 2, 6, 8, 8]
12
[0, 3, 5, 1, 2, 2, 10, 0, 7, 2, 6, 8, 2]
8
[0, 3, 5, 1, 2, 2, 10, 0, 8, 2, 6, 8, 2]
6
[0, 3, 5, 1, 2, 2, 1, 0, 8, 2, 6, 8, 2]
7
[0, 3, 5, 1, 2, 2, 1, 6, 8, 2, 6, 8, 2]
10
[0, 3, 5, 1, 2, 2, 1, 6, 8, 2, 6, 8, 2]
Я создал случайные списки в соответствии с кодом.
Когда я выполняю итерацию для дальнейшей генерации, выбирая какую-либо позицию, она выбирает и заменяет значение тем же значением. Пожалуйста, посмотрите последние 3 строки из раздела «Вывод». Он выбрал позицию 10 и снова заменил ее на 6. Как мы можем этого избежать?
Комментарии:
1. продолжайте рисовать до тех пор, пока значение не будет отличаться от исходного?
2. Я не понимаю. Когда я повторяю, я ожидаю, что не должно быть никаких старых строк.
Ответ №1:
Повторяйте до тех пор, пока оно не станет отличаться от текущего значения:
for i in range(10):
perturbdp = random.randint(1,12)
new_value = random.randint(0,10)
while new_value == d[perturbdp]:
new_value = random.randint(0,10)
d[perturbdp] = new_value
print(perturbdp)
print(d)
Если вы не хотите, чтобы ваши результаты повторялись, вам нужно будет повторить все возможные комбинации:
from itertools import combinations_with_replacement
import random
comb = combinations_with_replacement(range(11), 13) # all 13-elements combinations of int between 0 and 10
comb_r = [*comb] # putting them in a list
random.shuffle(comb_r) # shuffling the list
number_of_outputs = 10
for i in range(number_of_outputs):
print(list(comb_r[i]))
Комментарии:
1. Похоже, это работает. Я просто повторяю с большим числом, чтобы проверить, работает ли это так, как ожидалось. Я буду держать вас в курсе. Спасибо.
2. Я увеличил число итераций с 10 до 100. Я вижу это [0, 6, 10, 0, 2, 9, 8, 5, 5, 3, 1, 0, 1] повторяется во время итерации. Это повторяется не сразу после, а где-то посередине. Ваш пример гарантирует, что значения будут сгенерированы сразу после (немедленно).
3. В этом случае вам понадобится другой подход: повторите комбинации. Если вы пойдете совершенно случайным образом, некоторые элементы в конечном итоге повторятся. Я обновил свой ответ. При таком альтернативном решении повторения не произойдет.
Ответ №2:
Вы можете использовать random.choice
для выбора чисел из списка потенциальных значений
for i in range(10):
perturbdp = random.randint(1, 12)
nums = list(range(0, d[perturbdp])) list(range(d[perturbdp] 1, 11))
d[perturbdp] = random.choice(nums)
print(perturbdp)
print(d)
Выход
5
[0, 6, 9, 7, 2, 1, 4, 5, 3, 3, 8, 4, 2]
1
[0, 1, 9, 7, 2, 1, 4, 5, 3, 3, 8, 4, 2]
5
[0, 1, 9, 7, 2, 6, 4, 5, 3, 3, 8, 4, 2]
3
[0, 1, 9, 3, 2, 6, 4, 5, 3, 3, 8, 4, 2]
6
[0, 1, 9, 3, 2, 6, 6, 5, 3, 3, 8, 4, 2]
3
[0, 1, 9, 1, 2, 6, 6, 5, 3, 3, 8, 4, 2]
7
[0, 1, 9, 1, 2, 6, 6, 4, 3, 3, 8, 4, 2]
7
[0, 1, 9, 1, 2, 6, 6, 1, 3, 3, 8, 4, 2]
10
[0, 1, 9, 1, 2, 6, 6, 1, 3, 3, 5, 4, 2]
8
[0, 1, 9, 1, 2, 6, 6, 1, 7, 3, 5, 4, 2]
Комментарии:
1.Спасибо, что ответили. Здесь значения (одна и та же строка) повторяются.
7
[0, 10, 10, 0, 0, 2, 1, 9, 1, 3, 10, 0, 10]
11
[0, 10, 10, 0, 0, 2, 1, 9, 1, 3, 10, 0, 10]
2. Это не мешает новому
d[perturbdp]
быть неизменным между двумя итерациями (по крайней мере, это ожидалось ОП в моем понимании проблемы)3. @JustLearn вы имеете в виду, что хотите, чтобы каждый список имел уникальные значения?
4. @Guy Он не должен повторять ни одно из предыдущих 13 значений в списке. В вашем примере было выбрано 11, и он пытается изменить 11-ю позицию с тем же значением, которое уже было там.
5. @Парень, это работает. Если мне нужно сгенерировать случайное число между a и b (включая a, b) и умножить на 100, как я могу этого достичь? я пытался изменить ваш код, но он не работает