· Fuga578 · Python基礎  · 6 min read

Pythonで乱数を扱う — random モジュール完全入門

サイコロ・抽選・シャッフル・確率分岐 — ゲーム作りで頻出の「ランダムな処理」を、Python標準のrandomモジュールで実装する方法をまとめました。

サイコロ・抽選・シャッフル・確率分岐 — ゲーム作りで頻出の「ランダムな処理」を、Python標準のrandomモジュールで実装する方法をまとめました。

ゲームを作るとき、シミュレーションを書くとき、ちょっとした抽選プログラムを書くとき。「ランダム」が必要になる場面は意外と多いです。

Python には標準で random モジュールが付いていて、乱数まわりはこれだけで十分。この記事では、よく使う関数を実用例つきでまとめます。

random モジュールを読み込む

import random

これだけ。標準ライブラリなのでインストール不要。

サイコロを振る: random.randint(a, b)

a 以上 b 以下の整数をランダムに返します。両端を含む ことに注意 (b も含まれる)。

import random

dice = random.randint(1, 6)
print(f"サイコロの目: {dice}")
Terminal
サイコロの目: 4

実行するたびに違う数字が出ます。1〜6のサイコロ、1〜100のクジ、なんでもこれで作れます。

0〜1 の小数: random.random()

引数なしで 0.0 以上 1.0 未満の小数を返します。

import random

print(random.random())   # 例: 0.7234951...

これ単体では使いどころが少ないですが、確率分岐でよく使います。

# 30% の確率でクリティカルヒット
if random.random() < 0.3:
    print("クリティカル!")
else:
    print("通常攻撃")

random() が 0〜1 の範囲なので、「< 0.3」なら30%の確率で True になる。直感的。

範囲つき小数: random.uniform(a, b)

a 以上 b 以下の小数を返します。

import random

temp = random.uniform(20.0, 30.0)
print(f"今日の気温: {temp:.1f}℃")
Terminal
今日の気温: 24.7℃

randint の小数版だと思えば OK。

リストから1つ選ぶ: random.choice(seq)

リスト・タプル・文字列などから、要素をひとつランダムに取り出します。

import random

drinks = ["コーヒー", "紅茶", "コーラ", "水"]
print(f"今日の飲み物: {random.choice(drinks)}")
Terminal
今日の飲み物: 紅茶

ランダム抽選、ランダムイベントの実装で大活躍。

リストから複数選ぶ: random.sample(seq, k)

k 個を重複なしで取り出します。

import random

numbers = list(range(1, 44))   # 1〜43
lotto = random.sample(numbers, 6)
print(f"ロト6: {sorted(lotto)}")
Terminal
ロト6: [3, 11, 18, 25, 32, 41]

「重複なし」がポイント。同じ数字が出ないので、ロト・くじ・あみだくじ用に使えます。

重複ありで複数取り出したいとき: random.choices

# 重複あり
print(random.choices(["A", "B", "C"], k=5))
Terminal
['A', 'C', 'A', 'B', 'A']

重み付きで取り出す

choices確率の重み付け もできます。これがすごく便利。

# Aが50%、Bが30%、Cが20%の確率
result = random.choices(
    ["A", "B", "C"],
    weights=[5, 3, 2],
    k=10,
)
print(result)
Terminal
['A', 'A', 'B', 'A', 'C', 'A', 'A', 'B', 'C', 'A']

ガチャの「レア確率」を表現するのにぴったり。

リストをシャッフル: random.shuffle(seq)

リストの順序をランダムに並べ替えます。元のリストが直接書き換わる ので注意。

import random

cards = ["♠A", "♥K", "♦Q", "♣J"]
random.shuffle(cards)
print(cards)
Terminal
['♥K', '♣J', '♠A', '♦Q']

トランプのシャッフル、配列の並べ替えに使えます。

再現性が欲しいとき: random.seed

「毎回同じ乱数列が出てほしい」(テストやデバッグの再現性) ときは、シード値を固定します。

import random

random.seed(42)
print(random.randint(1, 100))   # 81
print(random.randint(1, 100))   # 14
random.seed(42)
print(random.randint(1, 100))   # また 81

シードを揃えれば、再実行しても同じ結果が出ます。

実用例: 数当てゲーム

ここまでの知識で書ける、簡単なゲーム。

import random

answer = random.randint(1, 100)
attempts = 0

print("1〜100 の数字を当ててください")
while True:
    guess = int(input("> "))
    attempts += 1
    if guess < answer:
        print("もっと大きい!")
    elif guess > answer:
        print("もっと小さい!")
    else:
        print(f"正解! {attempts}回で当たりました")
        break

これだけで、十分遊べるゲームになります。

まとめ — どの関数をいつ使う?

やりたいこと使う関数
整数の乱数 (1〜6など)random.randint(a, b)
0〜1の小数 (確率分岐)random.random()
範囲つき小数random.uniform(a, b)
リストから1つ選ぶrandom.choice(seq)
重複なしで複数選ぶrandom.sample(seq, k)
重複あり/重み付きで選ぶrandom.choices(seq, weights=, k=)
並び替えrandom.shuffle(seq)
再現性random.seed(値)

random モジュールはゲーム作りの定番ツール。次は実際にゲームを作る記事も書く予定なので、ぜひ手を動かしながら覚えてみてください。

Back to Blog

Related Posts

View All Posts »