Pythonで乱数(ランダムな整数・少数)を生成する関数

Pythonで乱数(ランダムな整数・少数)を生成する関数 プログラミング

「Pythonで乱数を発生させたい」

この記事は、上記の単純な要望に応える内容となります。
グダグダと乱数の能書きは書きません。

本当に理解できるように、ポイントを絞っています。
理解して乱数を発生できることが、何よりも重要なことです。

本記事の内容

  • Pythonで乱数を発生させる方法
  • random関数
  • uniform関数
  • randint関数
  • randrange関数
  • sample関数
  • Pythonで乱数を発生させる関数のまとめ

それでは、上記に沿って解説していきます。

Pythonで乱数を発生させる方法

今回は、Python標準ライブラリに含まれるrandomモジュールを用います。
標準ライブラリに含まれるため、別途ライブラリのインストールは不要です。

「乱数を発生させる」と言っても、状況によって条件は異なるでしょう。

乱数は1個なのか複数なのか?
乱数は整数なのか少数なのか?
乱数の範囲を指定するのか?固定でいいのか?

まず、発生したい乱数の数によって分けましょう。
1個であれば、次の4つの関数が利用できます。

関数名範囲指定戻り値の型
random()×(0<=X<1)float
uniform(a,b)〇(a<=X<=b OR b<=X<=a)float
randint(a,b)〇(a<=X<=b)int
randrange(a,b)〇(a<=X<b)int

複数の場合は、次の2つが関数が利用可能となります。

関数名重複
sample(population,k=N)×
choices(population,k=N)

populationは、シーケンスオブジェクトのことです。
Pythonでシーケンスオブジェクトと言えば、以下のデータオブジェクトになります。

  • リスト
  • タプル
  • range

また、sampleとchoicesの違いは重複を認めるかどうかだけです。
指定したN個の中に重複を認めるのは、choices関数ということになります。
認めないのは、sample関数ということです。

上記でだいぶと整理できたのではないでしょうか?
この辺は理解するまでは、ややこしいです。
でも、一度理解してしまえば、なんてことはありません。

以上、Pythonで乱数を発生させる方法について説明しました。
以下では、各関数を動きを確認していきます。

random関数

公式の定義

random.random()
次のランダムな浮動小数点数(範囲は [0.0, 1.0) )を返します。

randomモジュールは、忘れずにインポートします。
これはすべての関数において言えます。

import random

実際に動かしてみます。

import random

num = random.random()
print(num)

上記を実行すると、次のような0以上1未満の浮動小数点を1つだけ返します。

0.1822403829501874

利用頻度的には、random関数が最も多いのかもしれません。

uniform関数

公式の定義

random.uniform(a, b)
a <= b であれば a <= N <= b 、b < a であれば b <= N <= a であるようなランダムな浮動小数点数 N を返します。
端点の値 b が範囲に含まれるかどうかは、等式 a + (b-a) * random() における浮動小数点の丸めに依存します。

実際に動かしてみます。

import random

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

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

num = random.uniform(1.1, 2.1)
print(num)

num = random.uniform(2.1, 1.1)
print(num)

上記を実行した結果は、以下。

1.850803449725136
1.4000941694518514
1.8139676077160272
1.478061044377571

整数、少数の何でも引数に渡せます。
もちろん、マイナスの値もOK。

範囲指定した数値の中から、浮動小数点の値を一つだけ取得したい場合に利用します。

randint関数

公式の定義

random.randint(a, b)
a <= N <= b であるようなランダムな整数 N を返します。randrange(a, b+1) のエイリアスです。

uniform関数で指定した引数パターンは、4パターンありました。
randint関数においては、次のパターンだけ動きます。

import random

num = random.randint(1, 2)
print(num)

引数に小数点がある場合、エラーです。
そして、「a > b」となる場合もエラーとなります。

まあ、randint関数の方が感覚的にはしっくりきます。
「a > b」なんて引数に指定しようとは、普通はありませんから。

randrange関数

公式の定義

random.randrange(stop)
random.randrange(start, stop[, step])
range(start, stop, step) の要素からランダムに選ばれた要素を返します。

randrange関数を理解するには、range関数の理解が必要となります。
ただ、乱数を発生させるという点においては、randint関数と同じだという認識でOKです。

この場合、randint関数との違いは「step」になるでしょう。
詳細は、range関数を調べてください。

ここでは、次のような使い方で十分です。

import random

# 偶数
num = random.randrange(0, 10, 2)
print(num)

基本的には、randint関数を使います。
でも、偶数の乱数が欲しい場合は、上記のように引数を指定します。

sample関数

公式の定義

random.sample(population, k, *, counts=None)
母集団のシーケンスまたは集合から選ばれた長さ k の一意な要素からなるリストを返します。重複無しのランダムサンプリングに用いられます。

パッと見ると、よくわからない定義の説明です。
とりあえず、populationから指定した数だけ取得するということだけ覚えましょう。

その際、取得する値において重複を認めません。

import random

test = [1,2,3,4,5]
a = random.sample(test, k=5)
print(a)

上記を実行した結果は、以下。

[2, 4, 1, 5, 3]

値が、重複していません。

choices関数

公式の定義

random.choices(population, weights=None, *, cum_weights=None, k=1)
population から重複ありで選んだ要素からなる大きさ k のリストを返します。population が空の場合 IndexError を送出します。

sample関数と同じ機能という認識で問題ありません。
ただし、choices関数では重複を認めます。

import random

test = [1,2,3,4,5]
a = random.choices(test, k=5)
print(a)

上記を実行した結果は、以下。

[4, 5, 5, 3, 4]

値が、重複しています。

Pythonで乱数を発生させる関数のまとめ

ざっと関数を確認してきました。
乱数が1個か複数かにより、まずは大きく分かれます。

そして、1個の場合は整数か浮動小数点かにより、さらに分かれます。
もっとさらには、範囲指定の有無を含む方法によって関数が異なります。

また、複数の場合で補足しておきます。
例では、わかりやすいようにリスト形式[1,2,3,4,5]でpopulationを設定しました。

しかし、実際はpopulationはもっと広い範囲で指定するはずです。
例えば、以下のようにrange関数を用います。

import random

a = random.choices(range(1,1000), k=5)
print(a)

以上、Pythonで乱数を発生させる方法について説明してきました。

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