Python でリストから要素をランダムに選択する方法
-
Python でリストからランダムな要素を選択するモジュール
random
を使用する -
Python でリストからランダムな要素を選択するモジュール
secrets
を使用する -
Python でリストからランダムな要素を選択するモジュール
NumPy
を使用する
このチュートリアルでは、Python でリストからランダムな要素を選択する方法を紹介します。これを実現するためには複数の簡単な方法がありますが、そのすべてが Python モジュールのインポートを含んでいます。
このチュートリアルでは、random
、secrets
、NumPy
というモジュールを必要とするソリューションを扱います。
これらのソリューションはすべて擬似乱数発生器 (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つを使用することで実現できます。random
、secrets
、NumPy
です。それぞれに利点と欠点があります。
暗号的に安全な PRNG メソッドを作りたいのであれば、secrets
が最適です。シミュレーションや非センシティブなデータ操作のみを目的とするのであれば、random
か NumPy
のどちらかを使用するとよい。単一のランダムな結果以上の結果を得たいのであれば、NumPy
を使用するべきです。
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