[英]Python random.sample giving 'Sample larger than population or is negative' when sample same length as population
[英]“sample larger than population” in random.sample python
为自己创建一个简单的通行证生成器,我注意到如果我希望我的人口只有数字(0-9),这是总共 10 个选项,如果我希望我的长度超过 10,它不会使用任何数字超过一次和返回“样本大于总体”错误。
是否可以维护代码,但添加/减少代码行使其有效? 还是我必须使用使用随机选择?
import string
import random
z=int(raw_input("for: \n numbers only choose 1, \n letters only choose 2, \n letters and numbers choose 3, \n for everything choose 4:"))
if z==1:
x=string.digits
elif z==2:
x=string.letters
elif z==3:
x=string.letters+string.digits
elif z==4:
x=string.letters+string.digits+string.punctuation
else:
print "die in a fire"
y=int(raw_input("How many passwords would you like?:"))
v=int(raw_input("How long would you like the password to be?:"))
for i in range(y):
string=""
for n in random.sample(x,v):
string+=n
print string
泰
random.sample()
的目的是随机选择输入序列的一个子集,而不是多次选择任何一个元素。 如果您的输入序列没有重复,您的输出也不会。
你不是在寻找一个子集; 你想从输入序列中随机选择一个,重复多次。 元素可以多次使用。 random.choice()
在循环中使用random.choice()
:
for i in range(y):
string = ''.join([random.choice(x) for _ in range(v)])
print string
这将创建一个长度为v
的字符串,其中x
中的字符可以多次使用。
快速演示:
>>> import string
>>> import random
>>> x = string.letters + string.digits + string.punctuation
>>> v = 20
>>> ''.join([random.choice(x) for _ in range(v)])
'Ms>V\\0Mf|W@R,#/.P~Rv'
>>> ''.join([random.choice(x) for _ in range(v)])
'TsPnvN&qlm#mBj-!~}3W'
>>> ''.join([random.choice(x) for _ in range(v)])
'{:dfE;VhR:=_~O*,QG<f'
从 python_3.6 开始,您可以将random.choices(x, k=v)
用于您的目的。 它返回从带有替换的总体中选择的 ak 大小的元素列表。 如果人口为空,则引发 IndexError。
@Martijn Pieters 是对的。 但由于他们在https://docs.python.org/3.4/library/random.html 声明:
警告:该模块的伪随机生成器不应用于安全目的。 如果您需要加密安全的伪随机数生成器,请使用 os.urandom() 或 SystemRandom。
这样做的目的是为了生成密码,我建议使用这种方法:
import string
import random
set = string.letters + string.digits + string.punctuation
length = 20
password = ''.join( [ random.SystemRandom().choice( set) for _ in range( length) ] )
print( password)
有人可以确认这更安全吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.