Python でリストから要素をランダムに選択する方法

Rayven Esplanada 2023年1月30日
  1. Python でリストからランダムな要素を選択するモジュール random を使用する
  2. Python でリストからランダムな要素を選択するモジュール secrets を使用する
  3. Python でリストからランダムな要素を選択するモジュール NumPy を使用する
Python でリストから要素をランダムに選択する方法

このチュートリアルでは、Python でリストからランダムな要素を選択する方法を紹介します。これを実現するためには複数の簡単な方法がありますが、そのすべてが Python モジュールのインポートを含んでいます。

このチュートリアルでは、randomsecretsNumPy というモジュールを必要とするソリューションを扱います。

これらのソリューションはすべて擬似乱数発生器 (PRNG)を利用することに注意してください。

Python でリストからランダムな要素を選択するモジュール random を使用する

ランダム化に使われる最も一般的なモジュールは、random というモジュールです。このモジュールは、ランダム化を含む操作をサポートするための擬似ランダムユーティリティ関数を実装しています。

例えば、投票のようにリストからランダムな名前を選びたいとしましょう。

["John", "Juan", "Jane", "Jack", "Jill", "Jean"]

このリストからランダムな名前を選ぶには、random.choice() を用います。

import random

names = ["John", "Juan", "Jane", "Jack", "Jill", "Jean"]


def selectRandom(names):
    return random.choice(names)


print("The name selected is: ", selectRandom(names))

もちろん、出力は可変でランダムなものになります。ですから、変数 names に格納されている 6つの名前のうちのどれかにすることができます。

Python でリストからランダムな要素を選択するモジュール secrets を使用する

secrets モジュールは基本的に random と同じ目的で使われます。しかし、secrets は PRNG を実装するための暗号的に安全な方法を提供します。

実際のアプリケーションでは、パスワードの保存、認証、暗号化と復号化、トークンなどがあります。secrets は、random を使用するよりもはるかに安全であり、機密データを扱わないシミュレーションや操作にしか適していません。

この問題では、どちらのモジュールも同じ値を提供します。

この例では同じ names のリストを使用することにします。secrets には、random.choice() と同じ変数出力を生成する関数 choice() のバージョンもあります。

import secrets

names = ["John", "Juan", "Jane", "Jack", "Jill", "Jean"]


def selectRandom(names):
    return secrets.choice(names)


print("The name selected is: ", selectRandom(names))

Python でリストからランダムな要素を選択するモジュール NumPy を使用する

NumPy モジュールはランダム化のためのユーティリティ関数も持っており、関数 choice() の引数としていくつかの拡張ツールを持っています。

ここでも、同じリスト names を用いて、関数 numpy.random.choice() のデモを行います。

import numpy

names = ["John", "Juan", "Jane", "Jack", "Jill", "Jean"]


def selectRandom(names):
    return numpy.random.choice(names)


print("The name selected is: ", selectRandom(names))

この関数は、他の 2つのモジュールが生成したのと同じ変数出力を返します。

NumPy は、リストの形で複数の出力を生成するための他の引数を choice() にも提供しています。

第二引数には、返すランダムな要素の数を決定するための整数値を渡します。例えば、リスト names から 4つのランダムな要素を返したいとしましょう。

def selectRandom(names):
    return numpy.random.choice(names, 4)


print("The names selected are: ", selectRandom(names))

出力:

The names selected are: ['John', 'Jill', 'Jill', 'Jill']

ランダム化された結果には、同じ要素が複数回繰り返される可能性があります。

結果の要素を一意にしたい場合は、3 番目の引数 boolean を渡すことで、置換を行わずにランダムサンプリングを行うことができます。

def selectRandom(names):
    return numpy.random.choice(names, 4, False)

出力:

The names selected are: ['Jill', 'John', 'Jack', 'Jean']

この関数は常に重複した要素のないユニークなリストを生成します。

第 3 引数を追加した場合の大きな欠点は、重複をチェックして結果に存在しない要素に置き換えるタスクを追加して実行するため、関数の実行時間が長くなることです。

要約すると、Python のリストからランダムな要素を選択することは、これら 3つのモジュールのうちの 1つを使用することで実現できます。randomsecretsNumPy です。それぞれに利点と欠点があります。

暗号的に安全な PRNG メソッドを作りたいのであれば、secrets が最適です。シミュレーションや非センシティブなデータ操作のみを目的とするのであれば、randomNumPy のどちらかを使用するとよい。単一のランダムな結果以上の結果を得たいのであれば、NumPy を使用するべきです。

Rayven Esplanada avatar Rayven Esplanada avatar

Skilled in Python, Java, Spring Boot, AngularJS, and Agile Methodologies. Strong engineering professional with a passion for development and always seeking opportunities for personal and career growth. A Technical Writer writing about comprehensive how-to articles, environment set-ups, and technical walkthroughs. Specializes in writing Python, Java, Spring, and SQL articles.

LinkedIn

関連記事 - Python List