cover_python_cookbook

Python Cookbook [Picking Things at Random : random の活用] 投稿一覧へ戻る

Tags: Python , Cookbook , random

Published 2020年4月13日19:58 by T.Tsuyoshi

# Problem:
# シーケンスからランダムに要素を取り出したり、乱数を発生させたい。

# Solution:
# random モジュールには様々な関数が用意されています。

# シーケンスからランダムに要素を取り出します。
import random

values = ['Nana', 'Saki', 'Hana', 'Yuka', 'Megu', 'Eri', 'Kumi']

random.choice(values)
# → 'Hana'
random.choice(values)
# → 'Kumi'
random.choice(values)
# → 'Yuka'
random.choice(values)
# → 'Nana'

# シーケンスから N 個の要素を取り出します。ただし、N 個の要素は重複がないように取り出されます。
random.sample(values, 2)
# → ['Kumi', 'Hana']
random.sample(values, 2)
# → ['Nana', 'Eri']
random.sample(values, 4)
# → ['Megu', 'Hana', 'Nana', 'Kumi']
random.sample(values, 4)
# → ['Saki', 'Yuka', 'Eri', 'Kumi']

# シーケンス内の要素をシャッフルします。
random.shuffle(values)
values
# → ['Yuka', 'Nana', 'Saki', 'Hana', 'Eri', 'Megu', 'Kumi']
random.shuffle(values)
values
# → ['Kumi', 'Megu', 'Hana', 'Yuka', 'Saki', 'Nana', 'Eri']

# ランダムな整数を発生させます。
random.randint(0, 10)
# → 7
random.randint(0, 10)
# → 0
random.randint(0, 10)
# → 4

# 0.0 から 1.0 の間のランダムな浮動小数点数を発生させます。
random.random()
# → 0.7516435571401778
random.random()
# → 0.9080073461935058
random.random()
# → 0.17004346943699422

# N 桁の乱数ビットで表現される整数を返します。
random.getrandbits(100)
# → 1001294788148984200066165108852

# random モジュールは Mersenne Twister algorithm (メルセンヌツイスタ生成器) を基に乱数を生成させています。これは決定的アルゴリズムですが、random.seed() 関数を利用することで乱数発生源を変更することが可能です。

# 乱数発生源としてシステムタイマー、もしくは、os.urandom() を利用します。
random.seed()
# 与えられた整数を利用します。
random.seed(12345)
# 与えられたバイトデータを利用します。
random.seed(b'bytedata')

# ここまで紹介した以外にも、random モジュールには様々な実数値分布に対応する関数が含まれています。例えば、random.uniform() は均一分布から乱数を発生しますし、random.gauss() はガウス分布 (正規分布) に基づいて乱数を発生させます。

# 最後に。
# random モジュール内の関数を暗号化やセキュリティを扱うプログラムで利用してはいけません。前述したように random モジュールが基としているメルセンヌツイスタは完全に決定論的だからです。
# セキュリティに関連するプログラム中では ssl モジュールで提供されている関数を利用するようにします。例えば ssl.RAND_bytes(N) は N バイトの暗号的に強固な乱数を返します。

この投稿をメールでシェアする

0 comments

コメントはまだありません。

コメントを追加する(不適切と思われるコメントは削除する場合があります)