「サイコロのようにランダムな数字を出したい」「リストの中からランダムに1つ選びたい」――Pythonでちょっとしたゲームやツールを作ろうとすると、こんな場面に必ず出会いますよね。
そんなときに使うのが、Python標準ライブラリのrandomモジュールです。インストール不要で、importするだけですぐに乱数を扱えます。
この記事では、現役SEの筆者が random()・randint()・choice()・sample()・shuffle() などのよく使う関数を、実行例つきで初心者向けにやさしく解説します。最後にはミニゲームも作ってみましょう。
randomモジュールとは?
randomモジュールは、疑似乱数(コンピュータが計算で作る「ランダムっぽい」数)を生成するための標準モジュールです。使う前に、ファイルの先頭で次のようにimportします。
import randomなお、この記事のコード例の実行結果は一例です。乱数なので、実行するたびに結果が変わります。
ランダムな数値を作る関数
random():0以上1未満の小数
random.random() は、0.0以上1.0未満の小数(float)をランダムに返します。
import random
print(random.random())
# 実行結果(例):0.6394267984578837randint(a, b):a以上b以下の整数
いちばんよく使うのが randint() です。a以上b以下の整数を返します。b自身も含まれる点がポイントです。サイコロなら次のように書けます。
import random
dice = random.randint(1, 6)
print(dice)
# 実行結果(例):4randrange(start, stop, step):rangeと同じ感覚で選ぶ
randrange() は range() と同じ指定方法で、その範囲から1つ選びます。こちらはstopを含まないので注意しましょう。rangeの考え方はfor文・range関数の使い方の記事で詳しく解説しています。
import random
# 0, 2, 4, 6, 8 の中から1つ(偶数だけ)
print(random.randrange(0, 10, 2))
# 実行結果(例):6uniform(a, b):範囲を指定した小数
import random
print(random.uniform(1.0, 5.0))
# 実行結果(例):3.9662019990393316小数点以下が長すぎる場合は、round(値, 2) で丸めるか、f文字列(f-string)で f"{値:.2f}" のように表示桁数を指定すると見やすくなります。
リストからランダムに選ぶ・並び替える関数
choice():1つだけ選ぶ
import random
fruits = ["りんご", "バナナ", "みかん", "ぶどう"]
print(random.choice(fruits))
# 実行結果(例):バナナsample():重複なしで複数選ぶ
sample(リスト, k) は、重複なしでk個を選んで新しいリストを返します。抽選やくじ引きに便利です。
import random
fruits = ["りんご", "バナナ", "みかん", "ぶどう"]
print(random.sample(fruits, 2))
# 実行結果(例):['バナナ', 'みかん']choices():重複ありで複数選ぶ・重み付けもできる
choices() は同じ要素が何度選ばれてもよい選び方です。weights で「当たりやすさ」を指定できるので、ガチャのような確率付きの抽選も簡単に作れます。
import random
fruits = ["りんご", "バナナ", "みかん", "ぶどう"]
print(random.choices(fruits, k=3))
# 実行結果(例):['りんご', 'みかん', 'みかん']
# 当たり1:はずれ9 の確率で5回引く
print(random.choices(["当たり", "はずれ"], weights=[1, 9], k=5))
# 実行結果(例):['はずれ', 'はずれ', '当たり', 'はずれ', 'はずれ']shuffle():リストそのものを並び替える
shuffle() はリストの順番をランダムに入れ替えます。注意点は、元のリスト自体を書き換え、戻り値はNoneになることです。sort() と sorted() の関係に似ていますね(sortとsortedの違いはこちら)。
import random
nums = [1, 2, 3, 4, 5]
random.shuffle(nums)
print(nums)
# 実行結果(例):[2, 3, 1, 4, 5]
# よくある間違い
result = random.shuffle(nums)
print(result)
# 実行結果:None
# 元のリストを残したいなら sample で全件を選ぶ
original = [1, 2, 3, 4, 5]
shuffled = random.sample(original, len(original))
print(original) # [1, 2, 3, 4, 5]
print(shuffled) # 実行結果(例):[4, 1, 5, 3, 2]ここまでで、randomモジュールの主要な関数はひと通り使えるようになりました。「こうした基礎を独学で進めるのが不安」「質問できる環境がほしい」と感じたら、プログラミングスクールのおすすめ比較記事も参考にしてみてください。無料体験で自分に合う学び方を探すのもひとつの手です。
seed()で乱数を再現する
テストやデバッグのときに「毎回同じ乱数が出てほしい」ことがあります。そんなときは random.seed() でシード値を固定します。同じシードなら、同じ順番で同じ乱数が出ます。
import random
random.seed(42)
a = [random.randint(1, 100) for _ in range(3)]
random.seed(42)
b = [random.randint(1, 100) for _ in range(3)]
print(a) # [82, 15, 4]
print(b) # [82, 15, 4] ← 同じ結果になる上のコードで使っている [... for _ in range(3)] の書き方はリスト内包表記です。
実践:じゃんけんゲームを作ってみよう
choice() を使えば、コンピュータの手をランダムに決めるじゃんけんゲームが数行で作れます。
import random
hands = ["グー", "チョキ", "パー"]
win = {"グー": "チョキ", "チョキ": "パー", "パー": "グー"}
player = input("グー・チョキ・パーのどれを出す?:")
computer = random.choice(hands)
print(f"コンピュータ:{computer}")
if player not in hands:
print("入力が正しくありません")
elif player == computer:
print("あいこです")
elif win[player] == computer:
print("あなたの勝ち!")
else:
print("あなたの負け…")
# 実行結果(例)
# グー・チョキ・パーのどれを出す?:グー
# コンピュータ:チョキ
# あなたの勝ち!「どの手がどの手に勝つか」を辞書で持たせることで、if文の分岐をすっきり書けています。
注意:パスワードなどのセキュリティ用途には使わない
randomモジュールの乱数は予測可能な疑似乱数なので、パスワードや認証トークンの生成には向きません。セキュリティ用途では標準ライブラリの secrets モジュールを使いましょう。使い方はsecretsモジュールでパスワードを作成する記事で紹介しています。
もっと効率的にPythonを学びたい人へ
randomモジュールのように、Pythonは「知っていればすぐ書ける」便利な機能がたくさんあります。ただ、独学だと「何から学べばいいか分からない」「エラーで何時間も止まってしまう」ということも多いですよね。
未経験からPythonを確実に身につけたい方には、講師に直接質問できるマンツーマン指導のスクールがおすすめです。自分のペースで基礎から実践まで学べ、転職を見据えたサポートを受けられるところもあります。まずは無料カウンセリングで、学習の進め方を相談してみてはいかがでしょうか。
※本記事には広告(アフィリエイトリンク)を含みます。
Pythonプログラミング|マンツーマンレッスンで初めてをプロに育てる【Python Winner】![]()
まとめ
今回はPythonのrandomモジュールの使い方を解説しました。ポイントを振り返りましょう。
import randomだけで使える標準モジュールrandom()は0以上1未満の小数、randint(a, b)はb自身も含む整数randrange()はrangeと同じくstopを含まないchoice()で1つ、sample()で重複なし、choices()で重複あり・重み付きで選べるshuffle()は元のリストを書き換え、戻り値はNoneseed()で乱数を再現できる- パスワードなどセキュリティ用途には
secretsモジュールを使う
乱数を使えると、ゲームやシミュレーションなど作れるものの幅がぐっと広がります。ぜひ手を動かして試してみてください!
ナノトイラボ 
