Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonでランダムな数値やIDを生成する方法を徹底解説

プロジェクトでは、テスト用のサンプルデータの作成や空カラムへの値の埋め込みなど、さまざまな目的のためにランダムなデータを生成する必要があります。Pythonにはランダムデータを生成する方法が多数用意されており、この記事ではその代表的な手法をわかりやすく解説していきます。

Pythonのrandomモジュールとは

Pythonに標準で付属している重要なライブラリの一つがrandomモジュールです。この記事全体を通してこのモジュールを使用していきます。

randomモジュールを使うには、コードの先頭でインポートするだけで準備完了です。

import random

それでは、実際の使い方を見てみましょう。

import random
print("random.random()を使っているので何が出るかは不明")
print(random.random())

実行結果

random.random()を使っているので何が出るかは不明
0.5306626723173611

同じプログラムをもう一度実行すると、今度は異なる値が出力されます。

random.random()を使っているので何が出るかは不明
0.5504289430397661

randomモジュールのポイント

  • random() はrandomモジュールの基本となる関数です。
  • randomモジュールのほとんどの関数は、内部で random() 関数を利用しています。
  • random() 関数は [0.0 以上 1.0 未満) の範囲の浮動小数点数を生成します。

Pythonでランダムな整数を生成する

ランダムな整数を生成するには、以下の2つの関数を使用します。

  • randint(): 指定した範囲の両端を含む整数を生成
  • randrange(): 指定した範囲からステップ幅を考慮して整数を生成
from random import randint, randrange
print("ランダムな整数:", randint(0, 20))
print("ランダムな偶数:", randrange(0, 20, 2))

実行結果

ランダムな整数: 15
ランダムな偶数: 4

リストから要素をランダムに1つ選択する

企業名のリストがあり、そこから1つの要素(企業名)をランダムに取得したい場合を考えてみましょう。これは random.choice() を使うことで簡単に実現できます。

import random
companies = ['RELIANCE', 'TCS', 'INFY', 'SBI', 'PNB', 'HDFC']
print('リストからランダムに選択:', random.choice(companies))

実行結果

リストからランダムに選択: INFY

リストから複数の要素をランダムに選択する

先ほどの例では1つだけでしたが、今度は複数の要素をランダムに選択したい場合です。これには random.sample() 関数が便利です。

import random
companies = ['RELIANCE', 'TCS', 'INFY', 'SBI', 'PNB', 'HDFC']
print('リストから3社をランダムに選択:', random.sample(companies, 3))

実行結果

リストから3社をランダムに選択: ['TCS', 'RELIANCE', 'INFY']

ただし、sample() で指定する個数がリストの要素数より多い場合、ValueErrorが発生します。

random.sample(companies, 20)

エラー出力

ValueError: Sample larger than population or is negative

重複を許容して複数の要素を選択したい場合は、random.choices() を使用します。

import random
companies = ['RELIANCE', 'TCS', 'INFY', 'SBI', 'PNB', 'HDFC']
print('6社をランダムに選択:', random.choices(companies, k=6))

実行結果

6社をランダムに選択: ['TCS', 'TCS', 'INFY', 'HDFC', 'INFY', 'TCS']

上記の出力の通り、choices()重複あり(復元抽出)で選択を行うため、同じ要素が複数回現れることがあります。sample() との違いを覚えておくと良いでしょう。

シード値を使った擬似乱数生成器

擬似乱数生成器は、ある値に対して演算を行うことで乱数を生成します。一般的にこの値は「直前に生成された数値」ですが、最初に生成器を使用するときには前の値が存在しません。そこで登場するのがシード(seed)です。

import random
print("シード値 10:")
random.seed(10)
for i in range(5):
    print(random.randint(1, 100))
print()
print("シード値 5:")  # 今度は異なる値が出力される
random.seed(5)
for i in range(5):
    print(random.randint(1, 100))
print()
print("シード値 10:")  # 最初と同じ結果になる
random.seed(10)
for i in range(5):
    print(random.randint(1, 100))

実行結果

シード値 10:
74
5
55
62
74

シード値 5:
80
33
95
46
89

シード値 10:
74
5
55
62
74

この例からわかるように、同じシード値を設定すれば、毎回同じ乱数列が再現されます。各シード値は、特定の乱数生成器に対して固定の数列に対応しています。テストの再現性が必要な場面などで非常に役立ちます。

暗号学的に安全な乱数を生成する

セキュリティが求められる用途(トークン生成、パスワードリセット用キーなど)では、予測可能性のない暗号学的に安全な乱数を使う必要があります。

Python 3.6以降: secretsモジュール

Python 3.6以上であれば、新しく追加された secrets モジュールを使用できます。以下の例では、指定した値未満の安全な乱数を生成します。

import secrets
# 10〜500の範囲で安全な乱数を10個生成
for x in range(0, 10):
    secV = 10 + secrets.randbelow(500)
    print(secV)

実行結果

464
406
184
293
399
332
495
292
118
134

Python 3.5以前: SystemRandomクラス

Python 3.5以前の環境では、randomモジュールの SystemRandom クラスを使うことで、OSが提供する暗号学的に安全な乱数源を利用できます。

import random
randGen = random.SystemRandom()
for x in range(0, 10):
    secV = 10 + randGen.randint(0, 499)
    print(secV)

実行結果

374
211
425
264
217
97
210
39
319
52

secretsとrandomを組み合わせた使い方

さらに、randomとsecrets(データ保護用)モジュールを組み合わせて使用することもできます。

import secrets
import random
secNum = random.SystemRandom().random()
print("安全な乱数:", secNum)
print("安全なバイトトークン:", secrets.token_bytes(16))

実行結果

安全な乱数: 0.5205307353786663
安全なバイトトークン: b'\x05T>\xacsqn0\x08\xc4\xf4\x8aU\x13\x9f\xcf'

まとめ

Pythonでのランダムデータ生成には、用途に応じて適切なツールを選ぶことが重要です。

  • 通常の用途(テストデータ作成など): randomモジュール(random()randint()choice()sample())
  • 再現性が必要な場合: シード値(seed())を活用
  • セキュリティ関連: secretsモジュールやSystemRandomクラス

それぞれの特徴を理解して、目的に合った乱数生成を使い分けましょう。

  1. Pythonのrandom.seed()とは?乱数生成器の初期化とシード値の役割を解説

    random.seed()メソッドとは Pythonのrandomモジュールに含まれるseed()メソッドは、乱数生成器を初期化するための機能です。あらかじめシード値(種となる数値)を指定しておくことで、プログラムを実行するたびに同じ乱数列を再現できます。そのため、テストやデバッグ、結果の再現性が求められるシミュレーションなどで広く活用されています。 基本構文 random.seed(a, version) 引数「a」の挙動 第一引数であるaには、シード値として任意の値を渡します。指定内容によって以下のように動作が変わります。 aを省略した場合、またはNoneを指定した場合:現在のシステ

  2. Rubyで乱数を生成する方法まとめ:rand・srand・Randomクラスから正規分布、SecureRandomまで

    乱数は、ゲーム開発、暗号化、シミュレーションの構築など、さまざまな場面で活用される重要な要素です。しかし技術的に言えば、コンピュータは純粋な計算によって真の乱数を生成することはできません。決定論的なデバイスで真にランダムな値を作り出すことは根本的に不可能であり、私たちが扱えるのは、あたかもランダムに生成されたように見える数値の連なり、すなわち「疑似乱数」だけです。 本記事では、Rubyで乱数を生成するためのさまざまな方法を紹介します。 Kernel#randで乱数を生成する まずは最も基本的なrandメソッドから始めましょう。randを引数なしで呼び出すと、0.0以上1.0未満の浮動小数点数が