【Python】ランダムな文字列を生成する

ランダムな文字列の生成方法解説ページアイキャッチ

このページにはプロモーションが含まれています

このページでは、Python でランダムな文字列を生成する方法について解説します!

ランダムな文字列を生成する方法

では、早速ランダムな文字列を生成する方法について説明します。

結論としては、下記の get_random_string 関数でランダムな文字列の生成が実現できます。引数には生成したい文字列の文字数を指定します。

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の説明図

後述で補足をしますが、上記のソースコードで random.choices の第1引数に指定している LETTERS は「大文字と小文字の両方を含めた半角アルファベットが全て含まれる文字列」であるため、生成されるリストはランダムに選択された num 個の半角アルファベット(大文字と小文字の両方を含む)を要素とするリストとなります。

リストの要素を文字列として結合する

ただし、random.choices 関数で生成されるのはあくまでもリストであるため、これを文字列に変換する必要があります。リストの要素は、前述の通りランダムに選択された半角アルファベット文字となっていますので、これらを結合してやればランダムな文字列を生成できることになります。

そして、その結合を行なっているのが join メソッドであり、join メソッドは、このメソッドを実行した文字列を区切り文字として「引数で指定されたリストの各要素」を結合して文字列に変換するメソッドになります。

joinメソッドの説明図1

ただし、今回は単純にリストの要素を結合すれば良いだけなので区切り文字は不要です。そのため、join メソッドを実行する文字列は空文字列、すなわち '' としています(シングルクォーテーションマーク2つ)。

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 が参照する文字列に含まれる文字からランダムな文字列を生成するようになっています。ランダムな文字列を生成する方法 で示したスクリプトでは LETTERSstring.ascii_letters を参照させており、この string.ascii_lettersstring モジュールで下記のように定義されています(下記は string.py からの引用になります)。

stringモジュールでの変数の定義
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_lettersascii_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 におけるランダムな文字列の生成方法について解説を行いました!

案外簡単な仕組みでランダムな文字列を生成できることを理解していただけたのではないかと思います。

ちろん、入力する文字列がランダムなもので良い場合に限りますが、特にテストなどで手動で文字列を入力していたのであれば、今回紹介した方法を利用すれば効率はかなりアップするのではないかと思います!

同じカテゴリのページ一覧を表示

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です