mei_13のPython講座 ロゴ

【解説】予測できない「偶然」をプログラムに。Pythonで学ぶ乱数の世界




🐍 初心者歓迎!月額4,000円で質問し放題のPython講座
(1時間4,000円の伴走型ビデオチャット指導も受付中!)
🚀 講座の詳細を見る 📩 質問・お問い合わせ

予測できない「偶然」をプログラムに。Pythonで学ぶ乱数の世界


Yukiのアイコン
【Yuki】 Hirokiくん、こんにちは。今日はPythonで「乱数」を扱う方法について、一緒にお勉強していきましょうか。 プログラミングは、いつも決まった通りに動くのが基本ですけれど、ゲームやシミュレーションを作るときには、あえて「何が起こるかわからない」という要素が必要になることもあります。そんな時に役立つのが乱数なんです。


Hirokiのアイコン
【Hiroki】 Yukiさん、こんにちは!よろしくお願いします。 乱数って、サイコロの目みたいにバラバラに出てくる数字のことですよね。ゲームを作る時に敵の動きをランダムにしたり、アイテムのドロップ率を決めたりするのに使えそうで、ワクワクします!


Yukiのアイコン
【Yuki】 そうですね、その通りです。Pythonには、乱数を生成するための「random」という便利なライブラリが標準で用意されているんですよ。 このライブラリは、誰かの役に立つために作られた小さくて控えめな道具箱のようなもので、わたしはこういうひたむきなツールの話をしていると、なんだか少しだけ心が落ち着く気がします……。 では、まずは一番基本的な使い方から見ていきましょう。

1. randomモジュールの準備


Yukiのアイコン
【Yuki】 Pythonで乱数を使うためには、まず最初に import random と記述して、機能を呼び出す必要があります。

import random

# これでrandomモジュールの機能が使えるようになります


Hirokiのアイコン
【Hiroki】 import を書かないと始まらないんですね。これはもう覚えました!


Yukiのアイコン
【Yuki】 えらいですね。では、まずは 0.0以上 1.0未満の小数 をランダムに一つ出してみましょう。これには random.random() という関数を使います。

import random

# 0.0以上1.0未満のランダムな小数を表示
print(random.random())


Hirokiのアイコン
【Hiroki】 実行するたびに 0.582... とか 0.124... みたいに違う数字が出てきました!でも、これだけだと少し使いにくい気もします。たとえば、「1から6までの整数のサイコロ」みたいなものを作りたい時はどうすればいいんでしょうか?

2. 整数をランダムに生成する


Yukiのアイコン
【Yuki】 ふふ、そうですよね。整数の乱数は一番よく使われます。 それには、 random.randint(a, b) という関数を使うのが一番簡単だと思います。これは a以上 b以下 の整数をランダムに返してくれるものです。

import random

# 1から6までのサイコロを振る
dice = random.randint(1, 6)
print(f"サイコロの目は {dice} です")


Hirokiのアイコン
【Hiroki】 おっ、これなら直感的にわかります! randint(1, 6) なら「1、2、3、4、5、6」のどれかが出るってことですね。


Yukiのアイコン
【Yuki】 その通りです。ただ、プログラミングの世界では「最後の一つ手前まで」を範囲にすることが多いので、それに対応した random.randrange() という関数もよく使われます。 こちらは random.randrange(開始, 終了, ステップ) という書き方をして、 「終了」で指定した数字そのものは含まれない という特徴があります。

import random

# 0から9までの整数(10は含まない)
num = random.randrange(10)

# 0から10までの偶数(0, 2, 4, 6, 8, 10)
even_num = random.randrange(0, 11, 2)

print(num)
print(even_num)


Hirokiのアイコン
【Hiroki】 なるほど。 range() 関数と使い方が似ていますね。リストのインデックスを扱う時なんかには、こちらのほうが便利そうです。

3. リストから要素をランダムに選ぶ


Yukiのアイコン
【Yuki】 Hirokiくん、察しがいいですね。 実は、リストなどの「並び」の中からランダムに要素を選び出す機能も random モジュールには備わっているんですよ。 一番よく使うのは random.choice() です。

import random

kuji = ["大吉", "中吉", "小吉", "凶"]
result = random.choice(kuji)

print(f"今日の運勢は…… {result} です!")


Hirokiのアイコン
【Hiroki】 うわぁ、これだけでおみくじプログラムが作れちゃうんですね! 今まで学んだ if 文とかと組み合わせたら、本格的な占いアプリができそうです。


Yukiのアイコン
【Yuki】 ええ、きっと素敵なものが作れると思います……。 他にも、リストの中身をバラバラに混ぜてしまう random.shuffle() や、複数の要素を重複なしで選び出す random.sample() といったものもあります。

import random

cards = ["A", "2", "3", "4", "5", "J", "Q", "K"]

# リストそのものをシャッフルする(戻り値はないので注意です)
random.shuffle(cards)
print(f"シャッフル後: {cards}")

# リストから3枚だけ選ぶ
hand = random.sample(cards, 3)
print(f"引いたカード: {hand}")


Hirokiのアイコン
【Hiroki】 shuffle はトランプの山札を作る時に便利そうですし、 sample はプレゼント抽選会とかに使えそうですね。 ところで、 random.shuffle() の説明で「戻り値がない」って仰ったのはどういう意味ですか?


Yukiのアイコン
【Yuki】 あ、すみません、説明が足りませんでしたね。 random.shuffle(cards) を実行すると、新しく混ざったリストが返ってくるのではなく、 元の cards というリストの中身が直接書き換えられてしまう んです。 これをプログラミング用語で「破壊的な変更」と言ったりします。元の順番を消したくない場合は、リストをコピーしてから使うように気をつけてくださいね。

4. 範囲を指定した小数の乱数


Yukiのアイコン
【Yuki】 整数の話が続きましたが、小数の乱数でも範囲を指定したいことがありますよね。 その場合は random.uniform(a, b) を使うと、 a以上 b以下 の範囲で均等な確率で数値を生成してくれます。

import random

# 1.0から5.0の間のランダムな小数
weight = random.uniform(1.0, 5.0)
print(f"重さは {weight:.2f} kgです")


Hirokiのアイコン
【Hiroki】 random.random() は0から1まででしたけど、これなら好きな範囲を指定できるんですね。 それにしても、乱数って本当に「完全にデタラメ」なんですか?コンピュータって計算が得意だから、何か規則性があったりしないんでしょうか。

5. コンピュータの乱数の「種(シード)」


Yukiのアイコン
【Yuki】 ……鋭い質問ですね。実は、コンピュータが生成する乱数は「擬似乱数」と呼ばれていて、特定の計算式に基づいて作られています。 つまり、計算の基準となる 「シード(種)」 という数値が同じであれば、次に出てくる数字のパターンもすべて同じになってしまうんです。


Hirokiのアイコン
【Hiroki】 えっ、同じになっちゃうんですか?それじゃあ乱数にならないんじゃ……。


Yukiのアイコン
【Yuki】 普通は現在時刻などの常に変化する値をシードに使っているので問題ないのですが、あえてシードを固定することで、 「誰が実行しても同じ乱数の結果を再現する」 ことが可能になります。 これは、プログラムのバグを探すテストの時や、研究で実験結果を再現したい時にとても重要なんです。

import random

# シードを固定する
random.seed(10)

print(random.random()) # 何回実行しても同じ値が出るようになります


Hirokiのアイコン
【Hiroki】 なるほど、「あえて同じ乱数を出す」必要がある場面もあるんですね。奥が深いです……。

6. セキュリティと乱数


Yukiのアイコン
【Yuki】 ただ、一つだけ注意してほしいことがあります。 この random モジュールで作る乱数は、あくまで「それっぽく見える」だけの数値なんです。 もしHirokiくんが将来、パスワードの生成や暗号化など、 セキュリティが重要なプログラム を書くことになったら、 random モジュールは使わないでください……。


Hirokiのアイコン
【Hiroki】 えっ、どうしてですか?


Yukiのアイコン
【Yuki】 計算式がわかってしまうと、次にどんな乱数が出るか予測できてしまう可能性があるからです。 安全性が求められる場合は、Pythonに標準搭載されているもう一つのライブラリ、 secrets モジュールを使うのが一般的です。

import secrets

# セキュリティ的に強い乱数の生成
secure_token = secrets.token_hex(16)
print(f"安全なトークン: {secure_token}")


Hirokiのアイコン
【Hiroki】 使い分けが大事なんですね。ゲームなら random、お金や個人情報を扱うなら secrets。覚えておきます!

7. まとめと実践的な例


Yukiのアイコン
【Yuki】 はい、よく理解できましたね。 最後に、これまで学んだことを組み合わせて、簡単な「モンスター出現システム」みたいなものを作ってみましょうか。

import random

def encounter_enemy():
    enemies = ["スライム", "ゴブリン", "ドラゴン", "はぐれメタル"]

    # 出現する敵をランダムに決定
    enemy = random.choice(enemies)

    # 敵のレベルをランダムに決定 (1〜10)
    level = random.randint(1, 10)

    # 逃げられる確率を計算 (0.0〜1.0)
    escape_chance = random.random()

    print(f"{enemy} (Lv.{level}) があらわれた!")

    if escape_chance > 0.7:
        print("うまく逃げ切れた!")
    else:
        print("逃げられなかった!戦うしかない!")

# 実行
encounter_enemy()


Hirokiのアイコン
【Hiroki】 すごい!一気にゲームっぽくなりましたね。 random.choice で種類を選んで、 randint でレベルを決めて、 random で確率判定……。 これらを組み合わせるだけで、こんなに複雑な表現ができるなんて驚きです。


Yukiのアイコン
【Yuki】 そう言ってもらえると、わたしも嬉しいです。 乱数は、静かなプログラムに「命のゆらぎ」を与えるような、とても大切な要素だと思います。 今回お話しした関数を覚えておけば、大抵のことは実現できるはずですよ。


Hirokiのアイコン
【Hiroki】 はい!まずは自分で色々な数値を入れ替えて試してみます。 Yukiさん、今日も丁寧に教えてくれてありがとうございました!


Yukiのアイコン
【Yuki】 いいえ。わからないことがあったら、いつでも聞いてくださいね。 わたしは……夜のほうが頭が冴えていることが多いので、夜遅くの質問でも大丈夫ですよ。

参考資料



< Mecab
コラム一覧に戻る
PyInstaller >

この記事では基礎を解説しましたが、実務においては「もっと複雑なデータを扱いたい」「独自のシステムに組み込みたい」といった、個別の課題に直面することも多いはずです。

「自分で書く時間は最小限に抑え、プロの品質でツールを完成させたい」という方は、ぜひ一度ご相談ください。

「教わる」だけでなく「形にする」パートナーとして、フリーランスエンジニアのmei_13が最短ルートでの解決をサポートします。

➡ ココナラで制作・相談を依頼する(見積もり無料)


初心者から始められるPythonレッスン

プログラミング未経験者・初心者歓迎!
月額4,000円で質問し放題!!
● 完全オンライン
● 翌日までには必ず返信
● 挫折しない独自の学習メソッド
● 圧倒的高評価!!
テキストベースで時間を選ばない
4,000円/60分伴走型ビデオチャット指導も可能
● 高品質なサンプルコード
詳細はこちら

📩 質問・お問い合わせはこちら



AIアシスタント Yuki