サーチ…


構文

  • 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()

xy間のランダムな整数を返します(両端を含む):

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

統一

xy間のランダムな浮動小数点数を返します(両端を含む):

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

種子は固定されているので、これらの結果は常に94です。特定の数値を持つだけで値が同じである必要がない場合は、 getstatesetstateを使って以前の状態に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

シーケンスを擬似ランダム化するには、 Noneseedします。

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.choicerandom.randintなどのrandomモジュールがすぐに利用できる他のルーチンは、暗号の目的には適さないことに注意してください。

カーテンの背後には、 CSPRNGの要件を満たさないメルセンヌツイスターPRNGが使われています。したがって、特に、使用する予定のパスワードを生成するためにそれらを使用しないでください。上記のように、常にSystemRandomインスタンスを使用します。

Python 3.x 3.6

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


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow