Pythonで乱数を生成する|random関数の基本的な使い方
Pythonのrandom関数を使った乱数生成の基本から応用まで初心者向けに解説。整数・浮動小数点数・リストからの選択など実践的な使い方を具体例付きで紹介
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.8444218515250481print(random.uniform(1, 10)) # 1以上10未満: 7.123456789print(random.randint(1, 6)) # 1以上6以下の整数: 4print(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未満: 7print(random.randrange(1, 10)) # 1以上10未満: 5print(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 randomimport 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 randomimport 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()
でリストの順序をランダム化 - 実践的な活用:ゲーム、パスワード生成、テストデータ作成
乱数生成は、ゲーム開発、データ分析、テスト、シミュレーションなど、様々な場面で活用できる重要な機能です。 適切な関数を選択することで、用途に応じた最適な乱数を生成できます。
まずは基本的な関数から始めて、徐々に複雑な用途にも挑戦してみてください! シード値の設定や重み付きの選択など、高度な機能も活用すると、より柔軟なプログラムが作成できますよ。