Pythonでランダムな処理を行う【random】モジュールのイメージ画像

Pythonでランダムな処理を行う【random】モジュール

  • 公開日:2018/11/30
  • 更新日:2019/01/22
  • 投稿者:n bit

Pythonの組み込みモジュール『random』モジュールを使ってランダムに数値を生成したり、配列オブジェクトからランダムにオブジェクトを抽出、ランダムに並び替え、ランダムにサンプリング等を行う方法を解説します。

  • Python

この記事は約 分で読めます。(文字)

randomモジュールとは

randomモジュールはPythonの組み込みモジュールの1つ。ランダムな数値の生成や配列オブジェクトにランダムな処理を加える等、ランダムな実行処理に使えるモジュールです。

  • randomモジュール:ランダムな処理を行う組み込みモジュール

randomモジュールの使い方

具体的なrandomモジュールの利用方法を確認していきましょう。randomモジュール内には数多くの関数があります。randomモジュールのコードや内部の関数はこちらで確認することができます。

いくつか利用頻度が高いものから解説していきましょう。

random():0以上1未満の浮動小数点数をランダムに生成

randomモジュール内で1番標準的な関数です。『random()』は0以上1未満の浮動小数点数をランダムに生成します。

import random


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

出力結果

0.23122710334235608

0.9603160077198344
0.2947058025755246
0.6262347500984081
0.8668989649434684
0.1981924609200576
0.5832197103571308
0.08356141922060412
0.7904936926415418
0.10007907502573599

uniform(開始値, 終了値):指定範囲内で浮動小数点数をランダムに生成

『random()』は0以上1未満の浮動小数点数をランダムに生成しましたが、『uniform()』は開始値以上終了値未満の任意で指定した範囲内で浮動小数点数をランダムに生成します。

import random


for i in range(10):
print(random.uniform(1, 10))

出力結果

2.2168799167202655

7.081774500870121
7.697634563223482
9.550362162569673
1.4407671511347162
7.680897661375388
7.304692439596273
7.6636746749058515
9.07139784984245
8.772558757071728

randint(開始値, 終了値):指定範囲内で整数をランダムに生成

『uniform()』は開始値以上終了値未満の任意で指定した範囲内で浮動小数点数をランダムに生成しましたが、『randint()』は開始値以上終了値未満の任意で指定した範囲内で整数をランダムに生成します。

import random


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

出力結果

7

4
2
3
7
4
1
6
6
1

choice(配列):配列オブジェクトからランダムに要素を抽出

『choice()』は配列(シーケンス)オブジェクトからオブジェクト内の要素をランダムに1つだけ抽出します。

import random


words = ['Python', 'CSS', 'HTML', 'JavaScript']
print(random.choice(words))

出力結果

HTML

randrange(開始値, 終了値, ステップ値):指定範囲内で整数をランダムに生成

『randrange()』は関数名から何となく想像がつくかもしれませんがrange関数に先ほど解説したrandom.choice関数を足し合わせたような関数です。

range関数については下記ページで詳しく解説しています。

動きとしては、randrange関数の引数に指定した『開始値, 終了値, ステップ値』で生成されたレンジからランダムに値を抽出します。range間数と同じで引数の値には整数(int)しか指定できません。

import random


for i in range(10):
print(random.randrange(1, 10, 1))

出力結果

4

6
6
4
9
3
3
2
8
3

実際にrange間数とrandom.choice関数を組み合わせた動作でも同じような実力結果が得られます。

import random


for i in range(10):
print(random.choice(range(1, 10, 1)))

出力結果

8

4
3
9
6
2
3
9
9
8

shuffle(配列):配列オブジェクト内の要素をランダムにシャッフル

『shuffle()』は配列(シーケンス)オブジェクト内の要素をランダムに並び替えします。新しい配列オブジェクトは生成されず直接元の配列オブジェクトをシャッフルすることに注意してください。

import random


words = ['Python', 'CSS', 'HTML', 'JavaScript']
random.shuffle(words)
print(words)

出力結果

['HTML', 'Python', 'CSS', 'JavaScript']

sample(配列, k=サンプル数):配列オブジェクト内の要素をランダムに抽出

『sample()』は母集団となる配列オブジェクトから『k』に指定したサンプル数の数だけランダムに要素を抽出します。『sample()』はサンプリングが目的の為、1度抽出した要素は重複して抽出されません。

抽出された要素は新たなリストオブジェクトとして出力されます。

import random


words = ['Python', 'CSS', 'HTML', 'JavaScript']
words_sample = random.sample(words, k=2)
print(words_sample)

出力結果

['HTML', 'JavaScript']

choices(配列, k=サンプル数):配列オブジェクト内の要素をランダムに抽出

『sample()』と同じような働きをするのが『choices()』です。

『random.choices』と『random.sample』の違い

『random.choices』と『random.sample』の違いはランダム抽出時に要素の重複が『ある』か『ない』かです。

  • random.choices:要素ランダム抽出時重複あり
  • random.sample:要素ランダム抽出時重複なし

random.choices』は配列オブジェクトから『k』に指定した数だけ重複要素もある状態でランダムに抽出します。

抽出された要素は新たなリストオブジェクトとして出力されます。

import random


words = ['Python', 'CSS', 'HTML', 'JavaScript']
words_sample = random.choices(words, k=3)
print(words_sample)

出力結果

['HTML', 'HTML', 'JavaScript']

今日のdot

今回はPythonの組み込みモジュール『random』モジュールについて解説しました。『random』モジュールはこれ以外にも様々な関数を持っていますがその大半は分布方法の違いによるものです。

ランダム値の分布方法

『random.random()』モジュールは一様分布に従ってランダムに数値を生成します。それ以外にも次のような分布に従う乱数を生成するものが用意されています。

  • 三角分布:random.triangular(low, high, mode)
  • ベータ分布:random.betavariate(alpha, beta)
  • 指数分布:random.expovariate(lambd)
  • ガンマ分布:random.gammavariate(alpha, beta)
  • ガウス分布:random.gauss(mu, sigma)
  • 対数正規分布:random.lognormvariate(mu, sigma)
  • 正規分布:random.normalvariate(mu, sigma)
  • フォン・ミーゼス分布:andom.vonmisesvariate(mu, kappa)
  • パレート分布:random.paretovariate(alpha)
  • ワイブル分布:random.weibullvariate(alpha, beta)

しかしこれらの分布に従う乱数生成処理はNumpyにも用意されており、これよりも扱える種類が多く、かつ、実行処理も早いため基本的にはNumpyを利用しましょう。