【Python】randomモジュールの使い方を初心者向けに徹底解説!randint・choice・shuffleで乱数を使いこなす

randint・choice・shuffleを実例で解説

※このサイトの記事内では広告を掲載している場合があります。

「サイコロのようにランダムな数字を出したい」「リストの中からランダムに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.6394267984578837

randint(a, b):a以上b以下の整数

いちばんよく使うのが randint() です。a以上b以下の整数を返します。b自身も含まれる点がポイントです。サイコロなら次のように書けます。

import random

dice = random.randint(1, 6)
print(dice)
# 実行結果(例):4

randrange(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))
# 実行結果(例):6

uniform(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() は元のリストを書き換え、戻り値はNone
  • seed() で乱数を再現できる
  • パスワードなどセキュリティ用途には secrets モジュールを使う

乱数を使えると、ゲームやシミュレーションなど作れるものの幅がぐっと広がります。ぜひ手を動かして試してみてください!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA