Вы можете сохранить список и добавлять свои случайные числа в этот список, и когда вы обнаружите, что ваше случайное число уже есть в вашем списке, вы нарушаете цикл. Обратите внимание, что это решение O (n), так как вам нужно найти элемент во всем списке
import random
my_list = []
while True:
#Generate random number
i = random.randint(1, 100)
#If it is already in the list, break the loop
if i in my_list:
break
#Append random number to list
my_list.append(i)
print(my_list)
Вывод может выглядеть как
[5, 58, 84, 53]
[5, 29, 64, 52, 69, 53, 72, 41, 58, 50, 4, 68, 67, 22, 90, 32, 45, 17, 47, 89, 55, 6, 7, 46, 37, 88]
[17, 65, 46, 84, 30, 100, 48, 31, 80, 97, 70, 86, 47, 81, 13, 85, 60, 63, 22, 68, 8, 36, 99]
.....
Предложение O (1), уже указанное @ 6502, состоит в том, чтобы вместо этого добавить ваши случайные числа в качестве ключей словаря, этот поиск будет быстрее O(1)
import random
my_dict = {}
while True:
#Generate random number
i = random.randint(1, 100)
#If it is already in the keys of dict, break the loop
if i in my_dict:
break
#Append random number as key of dict with value 0
my_dict[i] = 0
print(list(my_dict.keys()))
На самом деле мы можем проверить улучшение, используя модуль timeit
, хотя это не заметно, поскольку размер случайного числа составляет всего 1-100
Первый для списка подход
In [21]: import random
...:
...: def get_list():
...: my_list = []
...: while True:
...: #Generate random number
...: i = random.randint(1, 100)
...: #If it is already in the list, break the loop
...: if i in my_list:
...: break
...: #Append random number to list
...: my_list.append(i)
...: return my_list
...:
In [22]: %timeit get_list()
16.9 µs ± 720 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
Тогда для продиктованного подхода
In [27]:
In [27]: import random
...:
...: def get_list():
...: my_dict = {}
...: while True:
...: # Generate random number
...: i = random.randint(1, 100)
...: # If it is already in the keys of dict, break the loop
...: if i in my_dict:
...: break
...: # Append random number as key of dict with value 0
...: my_dict[i] = 0
In [29]: %timeit get_list()
16.1 µs ± 567 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
Но разница заметна, если мы используем диапазон, скажем, 1-10000
In [38]: import random
...:
...: def get_list(upper):
...:
...: my_list = []
...: while True:
...: # Generate random number
...: i = random.randint(1, upper)
...: # If it is already in the list, break the loop
...: if i in my_list:
...: break
...: # Append random number to list
...: my_list.append(i)
...:
In [39]: %timeit get_list(10000)
287 µs ± 5.21 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [40]: import random
...:
...: def get_list(upper):
...:
...: my_dict = {}
...:
...: while True:
...: # Generate random number
...: i = random.randint(1, upper)
...: # If it is already in the keys of dict, break the loop
...: if i in my_dict:
...: break
...: # Append random number as key of dict with value 0
...: my_dict[i] = 0
...:
In [41]: %timeit get_list(10000)
155 µs ± 2.48 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
Вы можете видеть, что подход с использованием списка занял почти вдвое больше времени, чем метод dict!