您可以保留一个列表,并继续在该列表中添加随机数,当您发现您的随机数已经在您的列表中时,您会打破循环注意,这是您需要的 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]
.....
@6502 已经指出的 O(1) 建议是将随机数附加为字典的键,这样查找会更快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)
那么对于dict方法
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)
您可以看到 list 方法几乎是 dict 方法的两倍!