web-dev-qa-db-ja.com

random.sample pythonの「母集団より大きいサンプル」

自分用の単純なパスジェネレーターを作成しました。母集団を数字のみ(0〜9)にしたい場合、全体で10のオプションを使用します。長さを10以上にしたい場合は、数字を1回以上使用しません。 「母集団より大きいサンプル」エラーを返します。

コードを維持することは可能ですが、機能するようにコード行を追加/削減しますか?または私は使用のランダムな選択を使用する必要がありますか?

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

ty

11
Giladiald

random.sample()の-​​目的は、1つの要素を2回以上選択せずに、ランダムに入力シーケンスのサブセットを選択することです。入力シーケンスに繰り返しがない場合、出力も繰り返されません。

あなたはnotサブセットを探しています。入力シーケンスから単一のランダムな選択肢を何回か繰り返したい場合。要素は複数回使用できます。これには、ループで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'
13
Martijn Pieters

@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)

これがより安全であることを誰かが確認できますか?

2
lucas0x7B

Python_3.6以降では、目的に応じてrandom.choises(x, k=v)を使用できます。これは、母集団から選択された要素のkサイズのリストを置き換えて返します。母集団が空の場合、IndexErrorを発生させます。