在Python 2.7中,如何最有效地生成len=3
的唯一随机字符串 - 仅由数字组成 - 其中列表中包含的值(称为exclude_me
)不被视为而正在计算随机字符串?
E.g。 exclude_me=['312','534','434','999',...........,'123']
答案 0 :(得分:1)
只有1000个数字,您也可以只列出一个没有排除的数字,然后从中随机选择:
import random
numbers = range (111,1000)
exclude_me = [313,534,434,999,123]
difference = set(numbers).difference(set(exclude_me))
candidates = list(difference)
str(random.choice(candidates))
答案 1 :(得分:1)
如果排除列表很短,重复随机选择直到不排除结果将是最有效的方法:
excluded = set(int(x) for x in exclude_me)
while True:
candidate = random.randint(0, 999)
if candidate not in excluded:
result_int = candidate
break
result = '{:03d}'.format(result_int)
另一方面,如果排除列表很长,您可以通过准备一组符合条件的值来避免循环多次迭代:
included = set(range(1000)) - excluded
result_int = random.choice(list(included))
答案 2 :(得分:1)
如果exclude_me
列表的目的是通过存储已生成的数字来防止重复的数字,您可以创建有效数字的初始列表,随机随机播放列表,然后在需要时弹出一个项目一。这样您就不需要并行列表来跟踪那些已经生成的值,并且大部分工作都在初始设置中。
import random
population = ['{:03d}'.format(i) for i in range(1000)]
random.shuffle(population)
# get 10 unique numbers
for i in range(10):
print(population.pop())
对于1000个数字,这种事情是可行的。对于非常大的列表可能不太好。
答案 3 :(得分:0)
您可以声明大约1000个字符串的固定列表(即['000', '001', ..., '999']
,省略您喜欢的任何值,然后在该列表上调用random.choice()
。
如果您不想输入1000个字符串,则可以使用range()
然后.remove()
禁用值以编程方式生成列表。
答案 4 :(得分:-1)
这是一种非常简单(但效率不高)的方法:
import random
digits = '0123456789'
blacklist = set(['312','534','434','999',...........,'123'])
answer = '312'
while answer in blacklist:
answer = ''.join([str(i) for i in (random.choice(digits) for _ in range(3))])
另一种同样效率低下的方式:
import itertools
import random
digits = '0123456789'
blacklist = set(['312','534','434','999',...........,'123'])
options = [i for i in itertools.combinations_with_replacement(digits, 3) if i not in blacklist]
answer = random.choice(options)