Pythonで乱数を生成する|random関数の基本的な使い方

Pythonのrandom関数を使った乱数生成の基本から応用まで初心者向けに解説。整数・浮動小数点数・リストからの選択など実践的な使い方を具体例付きで紹介

Learning Next 運営
22 分で読めます

Pythonで乱数を生成する|random関数の基本的な使い方

みなさん、Pythonでランダムな数値を生成したことはありますか?

「ゲームでサイコロを振りたい」「テストデータを作りたい」「くじ引きプログラムを作りたい」 こんなときに困ったことはないでしょうか?

実は、random関数を使うことで、様々な種類の乱数を簡単に生成できます。 この記事を読めば、乱数生成の基本から実践的な活用法まで理解できるようになります。

今回は、Pythonのrandomモジュールの使い方を、実際のコード例とともに詳しく解説します。 一緒に乱数生成をマスターしていきましょう!

randomモジュールって何?

Pythonのrandomモジュールは、様々な種類の乱数を生成するための関数を提供します。

簡単に言うと、コンピュータがサイコロを振ったり、くじ引きをしたりできる機能です。 ゲーム開発やデータ分析、テストデータの作成など、幅広い場面で活用できます。

モジュールのインポート

まずは基本的な使い方を見てみましょう。

import random
# 基本的な乱数生成
print(random.random()) # 0.0以上1.0未満の浮動小数点数

実行結果はこちらです。

0.8444218515250481

import randomでrandomモジュールを読み込みます。 random.random()は0.0以上1.0未満の浮動小数点数を返します。

基本的な乱数関数

randomモジュールには、用途に応じた様々な関数があります。

# 様々な基本的な乱数
print(random.random()) # 0.0以上1.0未満: 0.8444218515250481
print(random.uniform(1, 10)) # 1以上10未満: 7.123456789
print(random.randint(1, 6)) # 1以上6以下の整数: 4
print(random.choice(['A', 'B', 'C'])) # リストから1つ選択: 'B'

それぞれの関数は異なる種類の乱数を生成します。 用途に応じて適切な関数を選ぶことが重要です。

整数の乱数を作ってみよう

整数の乱数は、ゲームのサイコロやくじ引きなど、よく使われる機能です。

randint関数

指定した範囲の整数をランダムに生成する関数です。

# 指定範囲の整数を生成
dice = random.randint(1, 6)
print(f"サイコロの目: {dice}")
# 複数回生成
print("サイコロを5回振る:")
for i in range(5):
print(f"{i+1}回目: {random.randint(1, 6)}")

実行結果はこちらです。

サイコロの目: 3 サイコロを5回振る: 1回目: 2 2回目: 6 3回目: 1 4回目: 4 5回目: 3

randint(a, b)はa以上b以下の整数を生成します。 両端の値も含まれるため、サイコロのような用途に適しています。

randrange関数

範囲指定でより細かく制御できる関数です。

# 範囲指定の乱数生成
print(random.randrange(10)) # 0以上10未満: 7
print(random.randrange(1, 10)) # 1以上10未満: 5
print(random.randrange(0, 10, 2)) # 0以上10未満の偶数: 4
# 配列のインデックスとして使用
data = ['apple', 'banana', 'orange', 'grape']
index = random.randrange(len(data))
print(f"選択された果物: {data[index]}")

実行結果はこちらです。

7 5 4 選択された果物: banana

randrange()範囲の上限を含まないため、配列のインデックスとして使う場合に便利です。

小数の乱数を作ってみよう

浮動小数点数の乱数は、より細かい値が必要な場合に使用します。

uniform関数

指定した範囲の小数を生成する関数です。

# 指定範囲の浮動小数点数
temperature = random.uniform(20.0, 30.0)
print(f"気温: {temperature:.2f}℃")
# 複数の値を生成
print("今週の気温予想:")
for day in range(7):
temp = random.uniform(18.0, 25.0)
print(f"{day+1}日目: {temp:.1f}℃")

実行結果はこちらです。

気温: 24.65℃ 今週の気温予想: 1日目: 22.3℃ 2日目: 19.7℃ 3日目: 23.8℃ 4日目: 21.2℃ 5日目: 20.9℃ 6日目: 24.1℃ 7日目: 22.6℃

uniform(a, b)はa以上b以下の浮動小数点数を生成します。 小数点以下の桁数は:.2fのような書式指定で調整できます。

正規分布に従う乱数

自然現象のようなデータを生成したい場合に使います。

# 正規分布(平均0、標準偏差1)
normal_value = random.gauss(0, 1)
print(f"正規分布の値: {normal_value:.3f}")
# 平均と標準偏差を指定
# 平均身長170cm、標準偏差10cmの正規分布
height = random.gauss(170, 10)
print(f"身長: {height:.1f}cm")
# 複数の値を生成
print("10人の身長データ:")
for i in range(10):
height = random.gauss(170, 10)
print(f" {i+1}番目: {height:.1f}cm")

実行結果はこちらです。

正規分布の値: 0.234 身長: 167.8cm 10人の身長データ: 1番目: 173.2cm 2番目: 165.9cm 3番目: 169.4cm 4番目: 178.1cm 5番目: 172.6cm 6番目: 168.3cm 7番目: 171.0cm 8番目: 164.7cm 9番目: 175.8cm 10番目: 170.5cm

gauss(mu, sigma)は平均mu、標準偏差sigmaの正規分布に従う乱数を生成します。 自然現象のシミュレーションや統計データの生成に使用されます。

リストから選んでみよう

リストやタプルから要素をランダムに選択する機能も便利です。

choice関数

リストから1つの要素をランダムに選択します。

# リストから1つ選択
fruits = ['apple', 'banana', 'orange', 'grape', 'melon']
selected = random.choice(fruits)
print(f"選択された果物: {selected}")
# 複数回選択(重複あり)
print("5回選択:")
for i in range(5):
fruit = random.choice(fruits)
print(f" {i+1}回目: {fruit}")

実行結果はこちらです。

選択された果物: banana 5回選択: 1回目: apple 2回目: banana 3回目: banana 4回目: orange 5回目: grape

choice()は指定したリストから1つの要素をランダムに選択します。

choices関数(重複あり)

重複を許可して複数の要素を選択できます。

# 重複ありで複数選択
fruits = ['apple', 'banana', 'orange']
selected = random.choices(fruits, k=5)
print(f"選択された果物: {selected}")
# 重み付きで選択
weights = [1, 2, 3] # orange が一番選ばれやすい
selected = random.choices(fruits, weights=weights, k=10)
print(f"重み付き選択: {selected}")

実行結果はこちらです。

選択された果物: ['banana', 'apple', 'orange', 'banana', 'apple'] 重み付き選択: ['orange', 'banana', 'orange', 'orange', 'apple', 'orange', 'banana', 'orange', 'orange', 'banana']

choices()重複を許可して複数の要素を選択できます。 重みを指定することで、特定の要素が選ばれやすくできます。

sample関数(重複なし)

重複なしで複数の要素を選択します。

# 重複なしで複数選択
numbers = list(range(1, 11)) # 1から10までの数字
selected = random.sample(numbers, 3)
print(f"選択された数字: {selected}")
# カードゲームのような用途
cards = ['A', 'K', 'Q', 'J', '10', '9', '8', '7', '6', '5', '4', '3', '2']
hand = random.sample(cards, 5)
print(f"手札: {hand}")

実行結果はこちらです。

選択された数字: [7, 3, 9] 手札: ['Q', '8', 'A', '5', 'J']

sample()重複なしで複数の要素を選択します。 カードゲームやくじ引きなど、同じ要素が複数選ばれない場合に使用します。

シャッフル機能を使ってみよう

リストの要素をランダムに並べ替える機能も提供されています。

shuffle関数

リストの順序をランダムに並べ替えます。

# リストのシャッフル
cards = ['A', 'K', 'Q', 'J', '10']
print(f"シャッフル前: {cards}")
random.shuffle(cards)
print(f"シャッフル後: {cards}")
# 数字のリストをシャッフル
numbers = list(range(1, 11))
print(f"元の順序: {numbers}")
random.shuffle(numbers)
print(f"シャッフル後: {numbers}")

実行結果はこちらです。

シャッフル前: ['A', 'K', 'Q', 'J', '10'] シャッフル後: ['J', 'A', '10', 'Q', 'K'] 元の順序: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] シャッフル後: [7, 3, 1, 9, 5, 2, 10, 4, 8, 6]

shuffle()元のリストを直接変更します。 カードのシャッフルやデータの順序をランダム化する際に便利です。

シャッフルのコピー版

元のリストを変更せずにシャッフルする方法もあります。

# 元のリストを変更せずにシャッフル
original = ['A', 'B', 'C', 'D', 'E']
shuffled = original.copy()
random.shuffle(shuffled)
print(f"元のリスト: {original}")
print(f"シャッフル版: {shuffled}")

実行結果はこちらです。

元のリスト: ['A', 'B', 'C', 'D', 'E'] シャッフル版: ['C', 'A', 'E', 'B', 'D']

元のデータを保持したい場合は、copy()メソッドを使用してからshuffle()を実行します。

実践的な活用例

実際のプログラムでどのように使うかを見てみましょう。

じゃんけんゲーム

コンピュータと対戦するじゃんけんゲームを作ってみましょう。

import random
def janken_game():
choices = ['グー', 'チョキ', 'パー']
print("じゃんけんゲーム開始!")
print("0: グー, 1: チョキ, 2: パー")
while True:
try:
user_choice = int(input("あなたの選択 (0-2): "))
if user_choice not in [0, 1, 2]:
print("0、1、2のいずれかを入力してください")
continue
computer_choice = random.randint(0, 2)
print(f"あなた: {choices[user_choice]}")
print(f"コンピュータ: {choices[computer_choice]}")
if user_choice == computer_choice:
print("あいこです")
elif (user_choice == 0 and computer_choice == 1) or \
(user_choice == 1 and computer_choice == 2) or \
(user_choice == 2 and computer_choice == 0):
print("あなたの勝ちです!")
else:
print("コンピュータの勝ちです")
break
except ValueError:
print("数字を入力してください")
# ゲーム実行
janken_game()

この例では、random.randint(0, 2)でコンピュータの選択を決定しています。

ユーザーの入力と比較して、勝敗を判定する仕組みです。

パスワード生成器

ランダムなパスワードを生成するプログラムです。

import random
import string
def generate_password(length=12):
"""ランダムなパスワードを生成"""
# 使用する文字の種類
lowercase = string.ascii_lowercase
uppercase = string.ascii_uppercase
digits = string.digits
symbols = "!@#$%^&*"
# すべての文字を組み合わせ
all_chars = lowercase + uppercase + digits + symbols
# パスワードの生成
password = ''.join(random.choices(all_chars, k=length))
return password
# パスワード生成の例
print("生成されたパスワード:")
for i in range(5):
password = generate_password(12)
print(f" {i+1}: {password}")
# 異なる長さのパスワード
lengths = [8, 12, 16, 20]
for length in lengths:
password = generate_password(length)
print(f"{length}文字: {password}")

実行結果はこちらです。

生成されたパスワード: 1: aB3#kL9@mP2$ 2: X7&qR5!nS8% 3: vH4*jF6@wE9# 4: C2$bN8&dM1! 5: pK7#zT3@xQ5& 8文字: aB3#kL9@ 12文字: X7&qR5!nS8%v 16文字: H4*jF6@wE9#C2$bN 20文字: 8&dM1!pK7#zT3@xQ5&mP

random.choices()で文字をランダムに選択し、安全なパスワードを生成しています。

テストデータの生成

データベースのテスト用データを作る例です。

import random
def create_sample_data(size=10):
"""サンプルデータを生成"""
# 名前のリスト
first_names = ['太郎', '花子', '次郎', '美咲', '健太', '由美']
last_names = ['田中', '佐藤', '鈴木', '高橋', '渡辺', '山田']
# 職業のリスト
jobs = ['エンジニア', 'デザイナー', '営業', 'マーケター', '企画', '事務']
data = []
for i in range(size):
# ランダムなデータを生成
name = f"{random.choice(last_names)}{random.choice(first_names)}"
age = random.randint(22, 65)
job = random.choice(jobs)
salary = random.randint(300, 800) * 10000 # 300万〜800万
data.append({
'id': i + 1,
'name': name,
'age': age,
'job': job,
'salary': salary
})
return data
# サンプルデータの生成
sample_data = create_sample_data(5)
print("生成されたサンプルデータ:")
for person in sample_data:
print(f"ID: {person['id']}, 名前: {person['name']}, "
f"年齢: {person['age']}, 職業: {person['job']}, "
f"年収: {person['salary']:,}円")

実行結果はこちらです。

生成されたサンプルデータ: ID: 1, 名前: 田中花子, 年齢: 28, 職業: デザイナー, 年収: 4,500,000円 ID: 2, 名前: 佐藤太郎, 年齢: 35, 職業: エンジニア, 年収: 6,200,000円 ID: 3, 名前: 鈴木美咲, 年齢: 29, 職業: 営業, 年収: 4,800,000円 ID: 4, 名前: 高橋健太, 年齢: 42, 職業: マーケター, 年収: 7,100,000円 ID: 5, 名前: 渡辺由美, 年齢: 31, 職業: 企画, 年収: 5,500,000円

random.choice()random.randint()を組み合わせて、現実的なテストデータを生成しています。

シード値の設定

同じ乱数列を再現したい場合に使用する機能です。

シード値の使い方

シード値を設定すると、同じ乱数列を生成できます。

import random
# シード値を設定
random.seed(42)
print("シード値42での乱数:")
for i in range(5):
print(f" {i+1}: {random.randint(1, 100)}")
# 同じシード値で再実行
random.seed(42)
print("
同じシード値で再実行:")
for i in range(5):
print(f" {i+1}: {random.randint(1, 100)}")

実行結果はこちらです。

シード値42での乱数: 1: 82 2: 15 3: 47 4: 12 5: 89 同じシード値で再実行: 1: 82 2: 15 3: 47 4: 12 5: 89

同じシード値を設定すると、同じ乱数列が生成されます。 テストでランダムな値を使いながら、結果を再現したい場合に便利です。

時刻ベースのシード値

実行するたびに異なる乱数列を生成したい場合の方法です。

import random
import time
# 現在時刻をシード値に使用
current_time = int(time.time())
random.seed(current_time)
print(f"シード値: {current_time}")
print("時刻ベースの乱数:")
for i in range(5):
print(f" {i+1}: {random.random():.6f}")

実行結果はこちらです。

シード値: 1704614400 時刻ベースの乱数: 1: 0.374540 2: 0.950714 3: 0.731994 4: 0.598658 5: 0.156019

時刻をシード値に使用すると、実行するたびに異なる乱数列を生成できます。

まとめ

Pythonのrandomモジュールについて、基本的な使い方から実践的な活用例まで解説しました。

今回学んだポイント

  • 整数の乱数:randint()randrange()で用途に応じて選択
  • 小数の乱数:uniform()gauss()で範囲や分布を指定
  • リストからの選択:choice()choices()sample()で重複を制御
  • シャッフル機能:shuffle()でリストの順序をランダム化
  • 実践的な活用:ゲーム、パスワード生成、テストデータ作成

乱数生成は、ゲーム開発、データ分析、テスト、シミュレーションなど、様々な場面で活用できる重要な機能です。 適切な関数を選択することで、用途に応じた最適な乱数を生成できます。

まずは基本的な関数から始めて、徐々に複雑な用途にも挑戦してみてください! シード値の設定や重み付きの選択など、高度な機能も活用すると、より柔軟なプログラムが作成できますよ。

関連記事