Python Language
ランダムモジュール
サーチ…
構文
- random.seed(a = None、version = 2)(バージョンはPython 3.xでのみ使用できます)
- random.getstate()
- random.setstate(state)
- random.randint(a、b)
- random.randrange(停止)
- random.randrange(開始、停止、ステップ= 1)
- random.choice(seq)
- random.shuffle(x、random = random.random)
- random.sample(population、k)
ランダムとシーケンス:シャッフル、選択とサンプル
import random
シャッフル()
random.shuffle()
を使用して、項目を変更可能かつ索引付け可能な順序で混合/ランダム化することができます。例えばlist
:
laughs = ["Hi", "Ho", "He"]
random.shuffle(laughs) # Shuffles in-place! Don't do: laughs = random.shuffle(laughs)
print(laughs)
# Out: ["He", "Hi", "Ho"] # Output may vary!
選択()
任意のシーケンスからランダムな要素を取ります:
print(random.choice(laughs))
# Out: He # Output may vary!
サンプル()
choice
と同様に、任意のシーケンスからランダムな要素を取りますが、指定できる数は次のとおりです。
# |--sequence--|--number--|
print(random.sample( laughs , 1 )) # Take one element
# Out: ['Ho'] # Output may vary!
同じ要素を2回使用することはありません。
print(random.sample(laughs, 3)) # Take 3 random element from the sequence.
# Out: ['Ho', 'He', 'Hi'] # Output may vary!
print(random.sample(laughs, 4)) # Take 4 random element from the 3-item sequence.
ValueError:母集団よりも大きなサンプル
ランダムな整数と浮動小数点数の作成:randint、randrange、random、およびuniform
import random
randint()
x
とy
間のランダムな整数を返します(両端を含む):
random.randint(x, y)
たとえば、 1
から8
までの乱数を得るには:
random.randint(1, 8) # Out: 8
randrange()
random.randrange
同じ構文を持っているrange
とは異なりrandom.randint
、最後の値は包括的ではありません 。
random.randrange(100) # Random integer between 0 and 99
random.randrange(20, 50) # Random integer between 20 and 49
random.rangrange(10, 20, 3) # Random integer between 10 and 19 with step 3 (10, 13, 16 and 19)
ランダム
0と1の間のランダムな浮動小数点数を返します。
random.random() # Out: 0.66486093215306317
統一
x
とy
間のランダムな浮動小数点数を返します(両端を含む):
random.uniform(1, 8) # Out: 3.726062641730108
再現可能な乱数:シードと状態
特定のシードを設定すると、固定乱数シリーズが作成されます。
random.seed(5) # Create a fixed state
print(random.randrange(0, 10)) # Get a random integer between 0 and 9
# Out: 9
print(random.randrange(0, 10))
# Out: 4
シードをリセットすると、再び同じ「ランダム」シーケンスが作成されます。
random.seed(5) # Reset the random module to the same fixed state.
print(random.randrange(0, 10))
# Out: 9
print(random.randrange(0, 10))
# Out: 4
種子は固定されているので、これらの結果は常に9
と4
です。特定の数値を持つだけで値が同じである必要がない場合は、 getstate
とsetstate
を使って以前の状態にgetstate
こともできます。
save_state = random.getstate() # Get the current state
print(random.randrange(0, 10))
# Out: 5
print(random.randrange(0, 10))
# Out: 8
random.setstate(save_state) # Reset to saved state
print(random.randrange(0, 10))
# Out: 5
print(random.randrange(0, 10))
# Out: 8
シーケンスを擬似ランダム化するには、 None
をseed
します。
random.seed(None)
または、引数なしでseed
メソッドを呼び出します。
random.seed()
暗号で安全な乱数を作成する
デフォルトでは、PythonランダムモジュールはMersenne Twister PRNG
を使用してPRNG
を生成しますが、シミュレーションなどのドメインには適していますが、厳しい環境でセキュリティ要件を満たすことはできません。
暗号的に安全な疑似乱数を生成するために、一つは使用できSystemRandom
使用している、 os.urandom
、暗号論的擬似乱数生成器として作用することができるCPRNG 。
それを使用する最も簡単な方法は、 SystemRandom
クラスの初期化だけです。提供されるメソッドは、ランダムモジュールによってエクスポートされるメソッドに似ています。
from random import SystemRandom
secure_rand_gen = SystemRandom()
範囲[0, 20]
randrange()
[0, 20]
に10のint
のランダムシーケンスを作成するには、単純にrandrange()
呼び出します。
print([secure_rand_gen.randrange(10) for i in range(10)])
# [9, 6, 9, 2, 2, 3, 8, 0, 9, 9]
与えられた範囲にランダムな整数を作成するには、 randint
を使うことができます:
print(secure_rand_gen.randint(0, 20))
# 5
したがって、他のすべての方法については、インターフェイスはまったく同じですが、唯一の変更は基本的な番号ジェネレータです。
os.urandom
直接使用して、暗号的に安全なランダムなバイトを取得することもできます。
ランダムなユーザーパスワードを作成する
ランダムなユーザーパスワードを作成するために、 string
モジュールで提供されるシンボルを使用できます。特にpunctuation
の句読点、 digits
文字とdigits
ascii_letters
:
from string import punctuation, ascii_letters, digits
次に、これらすべてのシンボルをsymbolsという名前で組み合わせることができsymbols
。
symbols = ascii_letters + digits + punctuation
これらのいずれかを削除して、より少ない要素でシンボルのプールを作成します。
その後、 random.SystemRandom
を使用してパスワードを生成することができます。長さ10のパスワードの場合:
secure_random = random.SystemRandom()
password = "".join(secure_random.choice(symbols) for i in range(10))
print(password) # '^@g;J?]M6e'
random.choice
、 random.randint
などのrandom
モジュールがすぐに利用できる他のルーチンは、暗号の目的には適さないことに注意してください。
カーテンの背後には、 CSPRNGの要件を満たさないメルセンヌツイスターPRNGが使われています。したがって、特に、使用する予定のパスワードを生成するためにそれらを使用しないでください。上記のように、常にSystemRandom
インスタンスを使用します。
Python 3.6から、 secrets
モジュールが利用可能となり、暗号の安全な機能が公開されています。
公式文書を引用すると、少なくとも1つの小文字、少なくとも1つの大文字、少なくとも3つの数字を持つ10文字の英数字のパスワードを生成するには、
import string
alphabet = string.ascii_letters + string.digits
while True:
password = ''.join(choice(alphabet) for i in range(10))
if (any(c.islower() for c in password)
and any(c.isupper() for c in password)
and sum(c.isdigit() for c in password) >= 3):
break
ランダムバイナリ決定
import random
probability = 0.3
if random.random() < probability:
print("Decision with probability 0.3")
else:
print("Decision with probability 0.7")