自分用の単純なパスジェネレーターを作成しました。母集団を数字のみ(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
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'
@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)
これがより安全であることを誰かが確認できますか?
Python_3.6以降では、目的に応じてrandom.choises(x, k=v)
を使用できます。これは、母集団から選択された要素のkサイズのリストを置き換えて返します。母集団が空の場合、IndexErrorを発生させます。