(1時間4,000円の伴走型ビデオチャット指導も受付中!)
予測できない「偶然」をプログラムに。Pythonで学ぶ乱数の世界
![]()
【Yuki】
Hirokiくん、こんにちは。今日はPythonで「乱数」を扱う方法について、一緒にお勉強していきましょうか。
プログラミングは、いつも決まった通りに動くのが基本ですけれど、ゲームやシミュレーションを作るときには、あえて「何が起こるかわからない」という要素が必要になることもあります。そんな時に役立つのが乱数なんです。
![]()
【Hiroki】
Yukiさん、こんにちは!よろしくお願いします。
乱数って、サイコロの目みたいにバラバラに出てくる数字のことですよね。ゲームを作る時に敵の動きをランダムにしたり、アイテムのドロップ率を決めたりするのに使えそうで、ワクワクします!
![]()
【Yuki】
そうですね、その通りです。Pythonには、乱数を生成するための「random」という便利なライブラリが標準で用意されているんですよ。
このライブラリは、誰かの役に立つために作られた小さくて控えめな道具箱のようなもので、わたしはこういうひたむきなツールの話をしていると、なんだか少しだけ心が落ち着く気がします……。
では、まずは一番基本的な使い方から見ていきましょう。
1. randomモジュールの準備
![]()
【Yuki】
Pythonで乱数を使うためには、まず最初に import random と記述して、機能を呼び出す必要があります。
import random
# これでrandomモジュールの機能が使えるようになります
![]()
【Hiroki】
import を書かないと始まらないんですね。これはもう覚えました!
![]()
【Yuki】
えらいですね。では、まずは 0.0以上 1.0未満の小数 をランダムに一つ出してみましょう。これには random.random() という関数を使います。
import random
# 0.0以上1.0未満のランダムな小数を表示
print(random.random())
![]()
【Hiroki】
実行するたびに 0.582... とか 0.124... みたいに違う数字が出てきました!でも、これだけだと少し使いにくい気もします。たとえば、「1から6までの整数のサイコロ」みたいなものを作りたい時はどうすればいいんでしょうか?
2. 整数をランダムに生成する
![]()
【Yuki】
ふふ、そうですよね。整数の乱数は一番よく使われます。
それには、 random.randint(a, b) という関数を使うのが一番簡単だと思います。これは a以上 b以下 の整数をランダムに返してくれるものです。
import random
# 1から6までのサイコロを振る
dice = random.randint(1, 6)
print(f"サイコロの目は {dice} です")
![]()
【Hiroki】
おっ、これなら直感的にわかります! randint(1, 6) なら「1、2、3、4、5、6」のどれかが出るってことですね。
![]()
【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】
なるほど。 range() 関数と使い方が似ていますね。リストのインデックスを扱う時なんかには、こちらのほうが便利そうです。
3. リストから要素をランダムに選ぶ
![]()
【Yuki】
Hirokiくん、察しがいいですね。
実は、リストなどの「並び」の中からランダムに要素を選び出す機能も random モジュールには備わっているんですよ。
一番よく使うのは random.choice() です。
import random
kuji = ["大吉", "中吉", "小吉", "凶"]
result = random.choice(kuji)
print(f"今日の運勢は…… {result} です!")
![]()
【Hiroki】
うわぁ、これだけでおみくじプログラムが作れちゃうんですね!
今まで学んだ if 文とかと組み合わせたら、本格的な占いアプリができそうです。
![]()
【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】
shuffle はトランプの山札を作る時に便利そうですし、 sample はプレゼント抽選会とかに使えそうですね。
ところで、 random.shuffle() の説明で「戻り値がない」って仰ったのはどういう意味ですか?
![]()
【Yuki】
あ、すみません、説明が足りませんでしたね。
random.shuffle(cards) を実行すると、新しく混ざったリストが返ってくるのではなく、 元の cards というリストの中身が直接書き換えられてしまう んです。
これをプログラミング用語で「破壊的な変更」と言ったりします。元の順番を消したくない場合は、リストをコピーしてから使うように気をつけてくださいね。
4. 範囲を指定した小数の乱数
![]()
【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】
random.random() は0から1まででしたけど、これなら好きな範囲を指定できるんですね。
それにしても、乱数って本当に「完全にデタラメ」なんですか?コンピュータって計算が得意だから、何か規則性があったりしないんでしょうか。
5. コンピュータの乱数の「種(シード)」
![]()
【Yuki】
……鋭い質問ですね。実は、コンピュータが生成する乱数は「擬似乱数」と呼ばれていて、特定の計算式に基づいて作られています。
つまり、計算の基準となる 「シード(種)」 という数値が同じであれば、次に出てくる数字のパターンもすべて同じになってしまうんです。
![]()
【Hiroki】
えっ、同じになっちゃうんですか?それじゃあ乱数にならないんじゃ……。
![]()
【Yuki】
普通は現在時刻などの常に変化する値をシードに使っているので問題ないのですが、あえてシードを固定することで、 「誰が実行しても同じ乱数の結果を再現する」 ことが可能になります。
これは、プログラムのバグを探すテストの時や、研究で実験結果を再現したい時にとても重要なんです。
import random
# シードを固定する
random.seed(10)
print(random.random()) # 何回実行しても同じ値が出るようになります
![]()
【Hiroki】
なるほど、「あえて同じ乱数を出す」必要がある場面もあるんですね。奥が深いです……。
6. セキュリティと乱数
![]()
【Yuki】
ただ、一つだけ注意してほしいことがあります。
この random モジュールで作る乱数は、あくまで「それっぽく見える」だけの数値なんです。
もしHirokiくんが将来、パスワードの生成や暗号化など、 セキュリティが重要なプログラム を書くことになったら、 random モジュールは使わないでください……。
![]()
【Hiroki】
えっ、どうしてですか?
![]()
【Yuki】
計算式がわかってしまうと、次にどんな乱数が出るか予測できてしまう可能性があるからです。
安全性が求められる場合は、Pythonに標準搭載されているもう一つのライブラリ、 secrets モジュールを使うのが一般的です。
import secrets
# セキュリティ的に強い乱数の生成
secure_token = secrets.token_hex(16)
print(f"安全なトークン: {secure_token}")
![]()
【Hiroki】
使い分けが大事なんですね。ゲームなら random、お金や個人情報を扱うなら secrets。覚えておきます!
7. まとめと実践的な例
![]()
【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】
すごい!一気にゲームっぽくなりましたね。
random.choice で種類を選んで、 randint でレベルを決めて、 random で確率判定……。
これらを組み合わせるだけで、こんなに複雑な表現ができるなんて驚きです。
![]()
【Yuki】
そう言ってもらえると、わたしも嬉しいです。
乱数は、静かなプログラムに「命のゆらぎ」を与えるような、とても大切な要素だと思います。
今回お話しした関数を覚えておけば、大抵のことは実現できるはずですよ。
![]()
【Hiroki】
はい!まずは自分で色々な数値を入れ替えて試してみます。
Yukiさん、今日も丁寧に教えてくれてありがとうございました!
![]()
【Yuki】
いいえ。わからないことがあったら、いつでも聞いてくださいね。
わたしは……夜のほうが頭が冴えていることが多いので、夜遅くの質問でも大丈夫ですよ。
参考資料
- Python 3.12 形式ドキュメント - random モジュール
- Python 3.12 形式ドキュメント - secrets モジュール
- Pythonの乱数生成完全ガイド (外部サイト例) ※実際の学習時は公式ドキュメントを最優先に参照してください。
この記事では基礎を解説しましたが、実務においては「もっと複雑なデータを扱いたい」「独自のシステムに組み込みたい」といった、個別の課題に直面することも多いはずです。
「自分で書く時間は最小限に抑え、プロの品質でツールを完成させたい」という方は、ぜひ一度ご相談ください。
- 専門家の知見に基づいた、保守性の高いコード設計
- AIの専門家による、Gemini API等の最新AIを組み合わせた高度な自動化
- ChatGPT等が生成したコードのデバッグ・最適化
「教わる」だけでなく「形にする」パートナーとして、フリーランスエンジニアのmei_13が最短ルートでの解決をサポートします。
初心者から始められるPythonレッスン
● 月額4,000円で質問し放題!!
● 完全オンライン
● 翌日までには必ず返信
● 挫折しない独自の学習メソッド
● 圧倒的高評価!!
● テキストベースで時間を選ばない
● 4,000円/60分の伴走型ビデオチャット指導も可能
● 高品質なサンプルコード
詳細はこちら

