Python

【Python】乱数の使い方【randomモジュール】

この記事では、Pythonで擬似乱数を生成する方法を解説します。Pythonではrandomモジュールを使うことで簡単に擬似乱数を生成することができます。

乱数を使うことでちょっとした遊びも実装できるので、ぜひ使ってみましょう!

それでは、乱数の使い方を見ていきましょう!

ランダムな整数を生成する

ランダムな整数を生成するには以下の2種類の関数が使えます。

randrange(start, stop, step)

randrange関数は、指定した範囲内の整数からランダムに値を取得します。

この関数はrange関数と同じ引数を持ち、範囲の生成方法も同じです。「range関数で生成した数列の中からランダムに選んだ要素を返す」と考えて差し支えありません。

import random

print(f'{list(range(5))}の中からランダムで値を取得')
print(random.randrange(5))

print(f'{list(range(3, 8))}の中からランダムで値を取得')
print(random.randrange(3, 8))

print(f'{list(range(1, 10, 2))}の中からランダムで値を取得')
print(random.randrange(1, 10, 2))

実行結果

[0, 1, 2, 3, 4]の中からランダムで値を取得
3
[3, 4, 5, 6, 7]の中からランダムで値を取得
6
[1, 3, 5, 7, 9]の中からランダムで値を取得
9

randint(a, b)

randint関数も引数で指定した範囲内のランダムな整数を取得できます。stepを指定しない場合はこちらの方が簡単に生成できます。

この関数は、randrange(a, b+1)のエイリアスです。

import random

for i in range(5):
    print(random.randint(1, 5))

実行結果

5
5
4
1
2

ランダムな実数を生成する

ランダムな実数を生成する方法を見ていきましょう!

0~1.0までの実数を取得する

random関数を使うことで、0~1.0までの実数をランダムに取得できます。

import random

for i in range(3):
    print(random.random())

実行結果

0.826771811764763
0.25275678622266295
0.5312438004922378

任意の桁数にするには、round関数を使って値を丸めましょう!

import random

for i in range(3):
    print(round(random.random(), 2))

実行結果

0.29
0.78
0.04

任意の範囲の実数を取得する

uniform関数を使うことで、任意の範囲内の実数をランダムに取得できます。第一引数よりも第二引数の方が大きい場合は「第一 <= N <= 第二」、第二引数よりも第一引数の方が大きい場合は「第二 <= N <= 第一」の範囲内の実数が得られます。

import random

print(random.uniform(1, 2))
print(random.uniform(2, 1))

実行結果

1.434554317626287
1.8638811147469798

シーケンスの要素をランダムに取得する

シーケンスの要素をランダムに取得する方法を見ていきましょう!

シーケンスの要素をランダムに取得する

choice関数の引数に指定されたシーケンスの要素をランダムに取得できます。引数に指定したシーケンスが空の場合はIndexErrorが発生します。

import random

l = ['いち', 'に', 'さん', 'し', 'ご']

for i in range(3):
    print(random.choice(l))


print(l)

実行結果

し
いち
ご
['いち', 'に', 'さん', 'し', 'ご']

確率を変更してシーケンスの要素を取得する

choices関数は、引数に渡されたシーケンスの要素をランダムに指定した回数だけ取得することができます。

また、重みを渡すことで要素が選ばれる確率を変更することができます。
重みはweights引数、またはcum_weights引数に配列を渡すことで指定できます。重みが渡されなかった場合は同じ確率で選択されます。

import random

# ガチャの中身
contents = ('超激レア', '激レア', 'レア')

# 累積的な重み(超激レア=10%, 激レア=20%, レア=70%)
cum_weights = (1, 3, 10)

# 10連ガチャ(k引数で回数を指定しています)
gacha10 = random.choices(contents, cum_weights=cum_weights, k=10)

# リザルト
for i, gacha in enumerate(gacha10, 1):
    print(f'{i}: {gacha}')

実行結果

1: レア
2: レア
3: レア
4: レア
5: レア
6: レア
7: 超激レア
8: レア
9: 激レア
10: レア

重みは第一引数に指定したシーケンスと同じ長さのシーケンスでなければなりません。また、相対的な重みは関数内で累積的な重みに変換されるので、最初から累積的な重みを渡すほうが効率が良いです。

シーケンスの要素をランダムに並び替える

シーケンスの要素をランダムに並び替えるにはshuffle関数を使います。ランダムに並び替えたシーケンスを返すのではなく、引数に指定されたシーケンスを並び変えます。

import random

# 連番のリスト生成
nums = list(range(1, 6))

print(nums)

# シャッフル
random.shuffle(nums)

print(nums)

実行結果

[1, 2, 3, 4, 5]
[2, 1, 3, 5, 4]

まとめ

この記事では、Pythonで擬似乱数を扱えるrandomモジュールの使い方を簡単に解説しました。乱数を使うことで何かしら値が必要な時にランダムに値を生成することができます。

randomモジュールには、今回紹介したもの以外にたくさんの関数が定義されています。気になる方は、公式ドキュメントを参照してください。

それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ

最短3か月でエンジニア転職「DMM WEBCAMP COMMIT」
なんと転職成功率98%!
今なら3日以内のカウンセリング枠を予約&参加で「1,000円分のAmazonギフト券」をプレゼント!