random.sample python中的"大于人口的样本"

Gil*_*ald 10 python string random

为我自己创建一个简单的传递生成器,我注意到如果我希望我的人口只有数字(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
Run Code Online (Sandbox Code Playgroud)

TY

Mar*_*ers 12

目的random.sample()是选择一个子集的输入序列的,随机,无需拾取任何一种元素多于一次.如果输入序列没有重复,输出也不会.

不是在寻找一个子集; 你想要从输入序列中单个随机选择,重复多次.元素可以使用多次.random.choice()在循环中使用:

for i in range(y):
    string = ''.join([random.choice(x) for _ in range(v)])
    print string
Run Code Online (Sandbox Code Playgroud)

这将创建一个长度字符串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'
Run Code Online (Sandbox Code Playgroud)

  • 你的解决方案是正确的,但我认为根据定义的样本是一个子集是不正确的.区别在于有和没有替换的采样之间(参见,例如,[Wikipedia](http://en.wikipedia.org/wiki/Sample_%28statistics%29)).此外,`numpy.random.choice`函数有一个选项,可以选择是否使用替换进行采样,因此,如果您正在处理numpy结构,这将非常有用. (3认同)
  • 不,“sample()”有*不同的*目的。想象一下从一副牌中随机挑选 4 张牌。您不能两次选择同一张卡,您需要从牌组中选择 4 张独特的卡。那是一个样本。 (2认同)

Але*_*вин 6

从 python_3.6 开始,您可以random.choices(x, k=v)用于您的目的。它返回从带有替换的总体中选择的 ak 大小的元素列表。如果人口为空,则引发 IndexError。