【Python】乱数を使ってみよう!【randomモジュール】

Python

この記事では、Pythonで擬似乱数を生成する方法を解説します。

Pythonでは、randomモジュールを使うことで簡単に擬似乱数を生成することができます。乱数を使うことでちょっとした遊びも実装できるので、ぜひ使ってみましょう!

任意の範囲のランダムな整数を生成する

任意の範囲のランダムな整数を生成するには以下の関数を使います。

  • randrange(start, stop, step)
  • randint(a, b)

randrange(start, stop, step)

randrange関数は、指定した範囲内のランダムな整数を取得できます。この関数はrange関数と同じ引数を持ち、範囲の生成方法も同じです。

range関数で範囲を生成して、その中からランダムに選んだ1つの要素を返すと考えて差し支えありません。

使い方

range関数と同じように引数を指定できます。

import random

# 0~stop
random.randrange(stop)

# start~stop
random.randrange(start, stop)

# start~stop step
random.randrange(start, stop, step)

サンプル

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)のエイリアスです。

使い方

生成される範囲はa <= N <= bとなります。

import random

random.randint(a, b)

サンプル

試しにfor文を使って乱数をいくつか出力してみます。

import random

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

実行結果

5
5
4
1
2

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

ランダムな実数を生成するには以下の関数を使います。

  • 0~1.0までの実数を取得する[random()]
  • 任意の範囲の実数を取得する[uniform(a, b)]

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

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

使い方

以下のように使います。

import random

random.random()

サンプル

random関数で取得した実数をfor文を使って何回か出力してみます。

import random

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

実行結果

0.826771811764763
0.25275678622266295
0.5312438004922378

任意の範囲の実数を取得する
uniform(a, b)

uniform関数を使うことで、任意の範囲内の実数をランダムに取得できます。

使い方

aよりもbの方が大きい場合はa <= N <= b、bよりもaの方が大きい場合はb <= N <= aの範囲内の実数が得られます。

import random

random.uniform(a, b)

サンプル

以下のコードでは、uniform関数の引数にランダムな実数を指定して、正常に範囲内の実数が取得できるか確認しています。

import random

for i in range(3):
    a = random.randint(1, 10) * random.random()
    b = random.randint(1, 10) * random.random()
    big, sma = (a, b) if a > b else (b, a)
    print(f'{sma} <= N <= {big}')
    print(random.uniform(a, b))

実行結果

0.13998208226685582 <= N <= 1.3264869015757925
0.750470964494466
0.10156131165866422 <= N <= 3.5658665626209123
3.140159002109402
1.6323063148899024 <= N <= 4.726715210518014
2.4459475829038864

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

ランダムにシーケンスの要素を取得することができます。

  • シーケンスの要素をランダムに取得する[choice(seq)]
  • 確率を変更して配列の要素を取得する[choices(population, weights=None, *, cum_weights=None, k=1)]

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

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

使い方

以下のように使います。

import random

random.choice(seq)

サンプル

試しに適当なリストを生成してみて、ランダムに要素を取得してみます。

import random

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

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


print(l)

実行結果

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

確率を変更してシーケンスの要素を取得する
choices(populationweights=None*cum_weights=Nonek=1)

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

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

使い方

import random

random.choices(population, weights=None, *, cum_weights=None, k=1)

population引数

ランダムに要素を取得したいシーケンスを指定する。

weights引数,cum_weights引数

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

k引数

いくつ要素を取得するかを指定できます。

サンプル

試しに10連ガチャっぽいコードを実装してみます。

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(x)]

shuffle関数は、引数に渡されたシーケンスをランダムに並び替えることができます。

ランダムに並び替えたシーケンスを返すのではなく、引数に指定されたシーケンス自体を並び変えます。

使い方

以下のように使います。

import random

random.shuffle(x)

サンプル

生成した数字の連番を並び替えてみます。

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

タイトルとURLをコピーしました