このページでは、Python でランダムな文字列を生成する方法について解説します!
Contents
ランダムな文字列を生成する方法
では、早速ランダムな文字列を生成する方法について説明します。
結論としては、下記の get_random_string
関数でランダムな文字列の生成が実現できます。引数には生成したい文字列の文字数を指定します。
import random
import string
LETTERS = string.ascii_letters
#LETTERS = string.ascii_letters + string.digits + string.punctuation
def get_random_string(num):
random_letters = random.choices(LETTERS, k=num)
random_string = ''.join(random_letters)
return random_string
# 30文字のランダムな文字列を生成して表示
print(get_random_string(30))
実行結果は下記のようになります。もちろん、実行するたびに生成される文字列は変化することになります。
uJoBclrrtqvxyZhBHaNvKTQXJqFOhu
5行目のコメントアウトを外せば数字や記号も含めたランダムな文字列の生成を行うことが可能となります。実行結果の例は下記となります。
@sO;8RR+3t_0E?e+{mKBw..?;W-I"C
ランダムな文字列が生成される仕組み
では、上記の get_random_string
関数でランダムな文字列が生成される仕組みについて解説しておきます。ここからは興味のある方のみ読んでいただければと思います。というか、上記のソースコードを読めば Python にある程度詳しい方なら仕組みは理解できるはずです。
スポンサーリンク
ランダムな文字のリストを生成する
まず、上記の get_random_string
関数の最初に実行しているのが random.choices
関数になります。ここで「第1引数で指定した文字列に含まれる文字」から引数 k
個の文字ををランダムに選択して取得し、それらを要素とするリストの生成を行なっています。
後述で補足をしますが、上記のソースコードで random.choices
の第1引数に指定している LETTERS
は「大文字と小文字の両方を含めた半角アルファベットが全て含まれる文字列」であるため、生成されるリストはランダムに選択された num
個の半角アルファベット(大文字と小文字の両方を含む)を要素とするリストとなります。
リストの要素を文字列として結合する
ただし、random.choices
関数で生成されるのはあくまでもリストであるため、これを文字列に変換する必要があります。リストの要素は、前述の通りランダムに選択された半角アルファベット文字となっていますので、これらを結合してやればランダムな文字列を生成できることになります。
そして、その結合を行なっているのが join
メソッドであり、join
メソッドは、このメソッドを実行した文字列を区切り文字として「引数で指定されたリストの各要素」を結合して文字列に変換するメソッドになります。
ただし、今回は単純にリストの要素を結合すれば良いだけなので区切り文字は不要です。そのため、join
メソッドを実行する文字列は空文字列、すなわち ''
としています(シングルクォーテーションマーク2つ)。
ということで、上記のように random.choices
関数と join
メソッドを実行することにより、ランダムな文字列が生成できることになります。
文字の重複無しのランダムな文字列の生成
さて、このページの最初に紹介した get_random_string
関数の実行によりランダムな文字列の生成を行うことができますが、get_random_string
関数で生成される文字列の各文字は重複する可能性があります。
文字の「重複無し」のランダムな文字列を生成したい場合は、random.choices
関数の代わりに random.sample
関数を実行するようにしてやれば良いです。引数も変更は不要です。
random.choices
関数の場合、第1引数に指定した文字列(リストやタプルでも可)から選択する文字の重複が「あり」であるのに対し、random.sample
関数は要素の重複が「無し」となります。そのため、上記のように random.sample
関数を使用するようにすれば、ランダムに生成される文字列の各文字の重複をなくすことができます。
ただし、random.sample
関数では、選択される要素が重複なしであるため、第1引数に指定する文字列の文字数(もしくはリスト等の要素数)が k
よりも小さいと例外が発生することになるので注意してください。
また、少し話は変わりますが、random.choices
関数の名前に似た関数として random.choice
が存在します。この関数の場合、ランダムに選択される要素の数が1つのみとなるので、関数名の間違いに注意してください。今回のように複数選択したい場合は random.choices
関数を利用する必要があります。
また、ここで挙げた関数の第1引数に関しては、ここまで文字列であることを前提として解説してきましたが、リストやタプルなどでも指定可能となっています。
スポンサーリンク
記号や数字等を含むランダムな文字列の生成
また、これに関しては ランダムな文字列を生成する方法 でも簡単に説明しましたが、get_random_string
関数では記号や数字等を含むランダムな文字列の生成も可能です。
get_random_string
関数では LETTERS
が参照する文字列に含まれる文字からランダムな文字列を生成するようになっています。ランダムな文字列を生成する方法 で示したスクリプトでは LETTERS
に string.ascii_letters
を参照させており、この string.ascii_letters
は string
モジュールで下記のように定義されています(下記は string.py
からの引用になります)。
whitespace = ' \t\n\r\v\f'
ascii_lowercase = 'abcdefghijklmnopqrstuvwxyz'
ascii_uppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
ascii_letters = ascii_lowercase + ascii_uppercase
digits = '0123456789'
hexdigits = digits + 'abcdef' + 'ABCDEF'
octdigits = '01234567'
punctuation = r"""!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~"""
printable = digits + ascii_letters + punctuation + whitespace
ascii_letters
は ascii_lowercase + ascii_uppercase
と定義されているため、大文字と小文字の両方を含む半角アルファベットすべてを含むことになります。そのため、get_random_string
関数では大文字と小文字の両方を含む半角アルファベットからランダムな文字列が生成されることになります。
ですが、上記のように、string
モジュールでは punctuation
で各種記号を含む文字列、digits
で数字の文字列が定義されているため、LETTERS
を ascii_letters + punctuation + digits
としてやれば、半角アルファベットだけでなく記号や数字も含めたランダムな文字列を生成することが可能となります。もちろん、ascii_lowercase
を指定して小文字のみのランダムな文字列を、ascii_uppercase
を指定して大文字のみのランダムな文字列を生成するようなこともできます。
string
モジュールを利用することで、楽に全半角アルファベットを指定したり数字を指定したりすることができますが、別に利用しなくても、random.choices
関数の第1引数に直接文字列を指定してランダムな文字のリストを生成することも可能です。また、日本語の平仮名や片仮名、漢字などのランダムな文字列を生成するようなこともできます。
要は、LETTERS
に指定する文字列(andom.choices
関数の第1引数に指定する文字列)によって、様々なランダムな文字列の生成を行うことが可能となります。
ランダムな文字列の使い道
最後にランダムな文字列の使い道について説明しておきます。
私がよくランダムな文字列を使うのは「自分が開発したプログラムのテストを行う時」になります。
例えば、ウェブアプリでユーザー登録を一気に何百件も行うようなテストを行いたい場合、通常であれば、その件数分のユーザーの名前をキーボードで入力する必要があります。ですが、今回紹介した方法でランダムな文字列を生成すれば、ユーザーの名前を自動的に入力することができて楽です。しかも早い。
こんな感じで、テストを行う際に文字列を入力する必要があるのであれば、今回紹介した方法を利用することで効率的にテストを実施することができるようになると思います。
まとめ
このページでは、Python におけるランダムな文字列の生成方法について解説を行いました!
案外簡単な仕組みでランダムな文字列を生成できることを理解していただけたのではないかと思います。
ちろん、入力する文字列がランダムなもので良い場合に限りますが、特にテストなどで手動で文字列を入力していたのであれば、今回紹介した方法を利用すれば効率はかなりアップするのではないかと思います!