Pythonのrandomモジュール入門!コピペでわかるランダム値生成の方法
PythonをコマンドプロンプトやPowerShellでPC上で動かすには、Pythonをダウンロードしてインストールする必要があります。
まだの方はPythonのインストールと開発環境の構築の記事を参考にして、Pythonをインストールしてください。
こんにちは!Webサイトに動きや意外性を加えたいと思ったことはありませんか?例えば、アクセスするたびに表示される画像を変えたり、ランダムなおすすめ記事を表示したり、あるいは開発中にダミーデータをたくさん作ったり。
こうした「ランダム性」を実現するために、Pythonにはrandomモジュールという非常に便利な標準ライブラリが用意されています。標準ライブラリなので、Pythonがインストールされていれば追加のインストールは不要ですぐに使える、Web制作者の頼れる味方です。
この記事では、Webクリエイター初心者の方でもすぐに使えるように、Pythonのrandomモジュールの使い方を基礎から応用まで、豊富なサンプルコードと共に徹底解説します。サンプルコードはすべて「コピー&ペーストするだけ」で完全に動作するように作られています。「まずは動かしてみる」ことで、乱数生成の楽しさと便利さを体感してください!
準備:randomモジュールのインポート
何はともあれ、randomモジュールの機能を使うには、まずPythonスクリプトの先頭でモジュールをインポート(読み込み)する必要があります。書き方はとても簡単で、以下の1行を記述するだけです。
import random
# これ以降、randomモジュールの機能が使えるようになります
print("randomモジュールがインポートされました!")
これで、random.〇〇()という形で、モジュール内の様々な機能(関数)を呼び出す準備が整いました。それでは、代表的な関数を一つずつ見ていきましょう。
基本編①:ランダムな整数を生成する (randint, randrange)
最もよく使う機能の一つが、指定した範囲のランダムな整数を生成する方法です。「1から6までの数字(サイコロ🎲)」や「100から200までのテスト点数」など、整数値の乱数が必要になる場面は非常に多くあります。
指定範囲の整数を取得:random.randint()
random.randint(a, b)は、引数として渡した2つの数値 `a` と `b` の間にあるランダムな整数を1つ返します。重要なポイントは、この範囲にはaとb自身も含まれる(a以上b以下)という点です。
例:1から6までのランダムな整数(サイコロ)
import random
# 1以上、6以下のランダムな整数を生成
dice_roll = random.randint(1, 6)
print(f"サイコロの目: {dice_roll}")
range()と同じ感覚で使う:random.randrange()
random.randrange()も整数を生成しますが、Python標準のrange()関数と同じように動作します。そのため、プログラマーにはこちらの方が直感的に感じられるかもしれません。
randrange(stop): 0以上、stop未満の整数。randrange(start, stop): start以上、stop未満の整数。randrange(start, stop, step): startからstop未満の範囲で、step間隔の整数。
randint(a, b)とは異なり、終点の値(stop)は範囲に含まれないことに注意が必要です。
例:0から9までのランダムな整数 (10は含まない)
import random
# 0以上、10未満のランダムな整数を生成
# range(10) と同じ考え方
number = random.randrange(10)
print(f"0から9までのランダムな数: {number}")
randrange()の真価は、特定のステップ(間隔)で乱数を生成したいときに発揮されます。例えば「偶数だけ」や「5の倍数だけ」といった指定が可能です。
例:10から100までのランダムな5の倍数
import random
# 10から開始して、101未満の範囲で、5ステップごと
# 候補は 10, 15, 20, ..., 100
multiple_of_five = random.randrange(10, 101, 5)
print(f"10から100までのランダムな5の倍数: {multiple_of_five}")
基本編②:リストから要素を選ぶ (choice, choices, sample)
Webサイトで「おすすめ記事リストからランダムに1つ表示する」「複数のバナー画像からいくつか選んで表示する」といった場面で非常に役立つ機能です。リストやタプルなどの集まり(シーケンス)から要素を抜き出します。
1つだけ選ぶ:random.choice()
random.choice(seq)は、リストやタプルなどのシーケンスから、ランダムに要素を1つだけ選び出します。シンプルで非常に使いやすい関数です。
例:おみくじの結果を1つ選ぶ
import random
fortunes = ["大吉", "中吉", "小吉", "吉", "凶", "大凶"]
# リストからランダムに1つ選ぶ
result = random.choice(fortunes)
print(f"今日の運勢は... {result} です!")
重複ありで複数選ぶ:random.choices()
random.choices(population, k=n)は、リストから要素を複数選び出します。重要なのは、これが重複を許す(復元抽出)という点です。つまり、一度選んだ要素が再び選ばれる可能性があります。kで選び出す個数を指定します。
例:コインを10回投げるシミュレーション(表と裏が重複して選ばれる)
import random
coin_sides = ["表", "裏"]
# coin_sidesから重複ありで10回選ぶ (k=10)
results = random.choices(coin_sides, k=10)
print(f"コイントスの結果: {results}")
print(f"表の回数: {results.count('表')}")
print(f"裏の回数: {results.count('裏')}")
さらにchoices()は、weights(重み)を指定することで、各要素の選ばれやすさを変えられます。これはゲームのガチャ機能など、確率を操作したい場合に非常に便利です。
例:レア度が高いアイテムが出にくいガチャのシミュレーション
import random
items = ["超絶レアSSR+", "SSR", "SR", "R", "N"]
# 確率: 0.5%, 3%, 15%, 30%, 51.5% に対応する重み
weights = [0.5, 3, 15, 30, 51.5]
# 重みを考慮して10回抽選する
gacha_results = random.choices(items, weights=weights, k=10)
print(f"10連ガチャの結果: {gacha_results}")
重複なしで複数選ぶ:random.sample()
random.sample(population, k)は、リストから要素を重複なしで複数選び出します(非復元抽出)。「参加者リストから重複なく抽選で3人を選ぶ」「表示する関連記事が重複しないようにする」といった場合に最適です。
例:5人のユーザーから抽選で2人の当選者を選ぶ
import random
users = ["UserA", "UserB", "UserC", "UserD", "UserE"]
# usersリストから重複なしで2人選ぶ (k=2)
winners = random.sample(users, k=2)
print(f"当選おめでとうございます!: {winners}")
基本編③:リストの順番を入れ替える (shuffle)
既存のリストの要素の順番をランダムに並べ替えたい場合は、random.shuffle(x)を使います。
注意点として、shuffle()は新しいリストを返すのではなく、元のリスト自体を直接書き換えます(インプレース操作)。そのため、元の順番を保持したい場合は、リストをコピーしてから使う必要があります。
例:カードのデッキをシャッフルする
import random
cards = ["A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"]
print(f"シャッフル前: {cards}")
# cardsリスト自体をランダムに並べ替える
random.shuffle(cards)
print(f"シャッフル後: {cards}")
もし元のリストを保持したまま、シャッフルされた「新しい」リストが欲しい場合は、前述のrandom.sample()を使うのが簡単です。リストの全要素数と同じ数をkに指定すれば、結果的にシャッフルされた新しいリストが得られます。
例:元のリストを保持してシャッフルしたリストを取得する
import random
original_list = [1, 2, 3, 4, 5]
# 元のリストの長さ(len(original_list))と同じ数だけサンプリングする
shuffled_list = random.sample(original_list, k=len(original_list))
print(f"元のリスト (変更なし): {original_list}")
print(f"シャッフルされた新しいリスト: {shuffled_list}")
基本編④:ランダムな小数を生成する (random, uniform)
整数だけでなく、小数点を含む数(浮動小数点数)をランダムに生成することもできます。アニメーションのパラメータや、A/Bテストの比率計算などに利用できます。
0.0から1.0の間の値:random.random()
random.random()は、最も基本的な小数生成関数で、0.0以上、1.0未満 ($0.0 \le N < 1.0$) の浮動小数点数をランダムに返します。引数は必要ありません。
例:ランダムな浮動小数点数を生成する
import random
value = random.random()
print(f"生成された値: {value}")
# 70%の確率で「成功」と表示する例
if value < 0.7:
print("70%の確率で成功!")
else:
print("残念、失敗...")
指定範囲の小数:random.uniform()
特定の範囲の小数が欲しい場合は、random.uniform(a, b)を使います。これは、a以上b以下 ($a \le N \le b$) の浮動小数点数をランダムに返します。
例:-1.0から1.0までのランダムな小数を生成する
import random
# -1.0以上、1.0以下のランダムな小数を生成
random_float = random.uniform(-1.0, 1.0)
print(f"生成された小数: {random_float}")
# 小数点以下3桁で表示したい場合
print(f"小数点以下3桁: {random_float:.3f}")
応用編:Web制作で使える実践的なサンプル
ここからは、これまでに学んだ基本関数を組み合わせて、Webクリエイターが実際の開発で使いそうな、より実践的な例を紹介します。
応用例①:ランダムなパスワードやID文字列を生成する
テストユーザーの初期パスワードや、一時的なセッションIDを生成したいときに便利です。ここではrandom.choice()と文字列操作、リスト内包表記を組み合わせたスマートな書き方を紹介します。
import random
import string
# 使用する文字の候補を定義
# string.ascii_letters は全ての英字 (a-z, A-Z)
# string.digits は数字 (0-9)
# string.punctuation は記号 (!"#$%&...)
characters = string.ascii_letters + string.digits + string.punctuation
print(f"使用する文字候補(一部): {characters[:20]}...")
# パスワードの長さを指定
length = 16
# リスト内包表記で、指定した長さのランダムな文字列を生成
# "".join(リスト) は、リストの各要素を連結して一つの文字列にする
random_password = "".join(random.choice(characters) for _ in range(length))
print(f"生成されたランダム文字列: {random_password}")
応用例②:Pythonでランダムな要素を含むHTMLを生成する
PythonはWebサーバーサイドでも活躍します。ここでは、ランダムな内容のHTMLファイルを動的に生成するコードを紹介します。これは、Webサイトのプロトタイプやテストデータを効率的に作りたいときに役立ちます。
以下のPythonコードは、実行するたびに異なる背景色と、異なるメッセージを持つ簡単なHTMLファイルを生成します。
Pythonコード:ランダムなHTMLを生成する
import random
# 1. ランダムなカラーコードを生成
# 0から16777215 (FFFFFF) までの整数を16進数に変換
bg_color = f"#{random.randint(0, 0xFFFFFF):06x}"
# 2. ランダムなメッセージとアイコンを選択
messages = [
("Pythonの世界へようこそ!", "🐍"),
("randomモジュールは便利ですね。", "👍"),
("Webデザインは楽しい!", "🎨"),
("今日もコーディング日和です。", "💻")
]
message, icon = random.choice(messages)
# 3. HTML構造をf-stringで作成
html_content = f"""<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ランダム生成ページ</title>
<style>
body {{
background-color: {bg_color};
color: #333;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
text-align: center;
padding-top: 100px;
transition: background-color 0.5s ease;
}}
.container {{
background-color: rgba(255, 255, 255, 0.8);
padding: 2em 3em;
border-radius: 12px;
display: inline-block;
box-shadow: 0 8px 20px rgba(0,0,0,0.15);
backdrop-filter: blur(10px);
}}
h1 {{
font-size: 2.5rem;
}}
</style>
</head>
<body>
<div class="container">
<h1>{icon} {message}</h1>
<p>このページの背景色は <strong>{bg_color}</strong> です。</p>
</div>
</body>
</html>
"""
# 4. 生成されたHTMLを "random_page.html" という名前でファイルに保存
with open("random_page.html", "w", encoding="utf-8") as f:
f.write(html_content)
print("`random_page.html` を生成しました。ブラウザで開いて確認してください。")
上記のPythonスクリプトを実行すると、スクリプトと同じ階層に `random_page.html` というファイルが作られます。このファイルをブラウザで開くと、実行ごとに異なるデザインのページが表示されるはずです。ぜひ試してみてください。
気をつけるべき点と高度な使い方
乱数の再現性:random.seed()
randomモジュールが生成する乱数は、実は完全なランダムではなく、特定の計算式(アルゴリズム)によって生成される疑似乱数です。この計算の出発点となるのが「シード(seed, 種)」と呼ばれる値です。
通常、シードは現在時刻など予測困難な値から自動で設定されるため、実行するたびに異なる乱数列が生成されます。しかし、デバッグやテストの際には、「ランダムだけど、毎回同じ順番でランダムな値」を生成したいことがあります。これを実現するのがrandom.seed()です。
random.seed()に特定の数値(シード値)を与えると、それ以降に生成される乱数の系列が完全に固定されます。何度実行しても、同じシード値からは同じ乱数が同じ順番で出現します。
import random
# シード値を 42 に設定
random.seed(42)
print("--- シード値 42 での実行 ---")
print(random.randint(1, 100))
print(random.choice(["A", "B", "C"]))
print(random.random())
print("\n--- もう一度、シード値 42 で実行 ---")
# 再びシード値を同じ値に設定すると、乱数の系列がリセットされ、全く同じ結果になる
random.seed(42)
print(random.randint(1, 100))
print(random.choice(["A", "B", "C"]))
print(random.random())
【最重要】セキュリティ用途にはsecretsモジュールを使う
警告:これは非常に重要な注意点です。
これまで紹介してきたrandomモジュールは、統計的なランダムさや一般的な用途には十分ですが、そのアルゴリズムは公知のものであり、生成される乱数には予測可能性があるため、暗号学的に安全ではありません。
つまり、Webアプリケーションの以下のようなセキュリティが重要な機能にrandomモジュールを使用してはいけません。
- ユーザーのパスワード生成・リセットトークン
- セッションIDや認証トークン
- APIキーの生成
- その他、第三者に推測されては困るあらゆる秘密の値
これらの用途には、Python 3.6から標準ライブラリに追加された、暗号学的に安全な乱数を生成するための専用モジュールsecretsを必ず使用してください。
secretsモジュールの使い方はrandomモジュールとよく似ていますが、OSが提供する最も安全な乱数源を利用するため、第三者による予測が極めて困難です。
例:secretsモジュールで安全なトークンを生成する
import secrets
import string
# --- 安全なURL用トークン(32バイト)の生成 ---
# パスワードリセット用URLなどに利用できる
url_safe_token = secrets.token_urlsafe(32)
print(f"安全なURL用トークン: {url_safe_token}")
# --- 安全なパスワードの生成例(16文字) ---
# 英数字と記号を候補文字とする
alphabet = string.ascii_letters + string.digits + string.punctuation
# secrets.choice() を使って安全に文字を選ぶ
secure_password = ''.join(secrets.choice(alphabet) for i in range(16))
print(f"安全なパスワード例: {secure_password}")
まとめ
この記事では、Pythonのrandomモジュールを使った乱数生成の基本から、Web制作での実践的な応用例、そしてセキュリティに関する重要な注意点までを詳しく解説しました。
最後に、主要な関数をもう一度おさらいしておきましょう。
- 整数:
random.randint(a, b)(a, bを含む),random.randrange(start, stop)(stopを含まない) - 要素の選択:
random.choice(seq)(1つ),random.choices(seq, k=n)(重複ありでn個),random.sample(seq, k=n)(重複なしでn個) - 並べ替え:
random.shuffle(x)(元のリストを直接変更) - 小数:
random.random()(0.0~1.0),random.uniform(a, b)(a~bの範囲) - 再現性:
random.seed(value)(乱数系列を固定) - セキュリティ: パスワードやトークンには必ず
secretsモジュールを使う!
これらの関数を使いこなせば、Web開発におけるテストデータの作成や、ユーザー体験にちょっとした驚きやインタラクティブ性を加えることが簡単にできます。ぜひ、紹介したコードをコピペして、実際に動かしながらランダム生成の機能をあなたのものにしてください!
🚀 次のステップへ
Pythonでのデータ操作に慣れてきたら、次は文字列操作の強力なツールである「正規表現」に挑戦してみましょう。複雑なテキストデータの検索や置換が格段に楽になります。