「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で乱数を発生させる方法について説明してきました。