ヘッダー
Python サンプル集
 

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

2022/11/20

→ C# のサンプルに切り替える → Visual Basic のサンプルに切り替える

 

A ~ Z からなるランダムな5文字を生成する

import string
import random

result = ''.join(random.choices(string.ascii_uppercase, k=5))

print(result) #出力例 FJPEZ

 

これでもできます。

import string
import random

result = ''.join(random.choice(string.ascii_uppercase) for _ in range(5))

print(result) #出力例 FJPEZ

 

これでもできます。

import random

result = ''.join(chr(random.choice(range(ord('A'), ord('Z')))) for _ in range(5))

print(result) #出力例 FJPEZ

 

 

A ~ Z からなる文字が重複しないランダムな5文字を生成する

import string
import random

result = ''.join(random.sample(string.ascii_uppercase, 5))

print(result) #出力例 FJPEZ

 

 

半角英数 からなるランダムな5文字を生成する

import string
import random

result = ''.join(random.choices(string.ascii_letters + string.digits, k=5))

print(result) #出力例 H2cEc

 

 

半角英数 からなる文字が重複しないランダムな5文字を生成する

import string
import random

result = ''.join(random.sample(string.ascii_letters + string.digits, k=5))

print(result) #出力例 RE3d8

 

 

ひらがな からなるランダムな5文字を生成する

import random

chars = list("あいうえおかきくけこさしすせそたちつてとなにぬねの" +
             "はひふへほまみむめもやゆよらりるれろわをん" +
             "がぎぐげござじずぜぞだぢづでどばびぶべぼぱぴぷぺぽ" +
             "っゃゅょ")

result = ''.join(random.choices(chars, k=5))

print(result) #出力例 ぬがゃぺょ

メモ:この例で生成されない ひらがな の例は「ゑ」、「ゔ」、「ぁ」(小さい あ)、「ゕ」(小さい か)など

メモ:Unicode で定義されている全ひらがなは Hiranaga で確認できます。

 

 

カタカナ からなるランダムな5文字を生成する

import random

chars = list("アイウエオカキクケコサシスセソタチツテトナニヌネノ" +
             "ハヒフヘホマミムメモヤユヨラリルレロワヲン" +
             "ガギグゲゴザジズゼゾダヂヅデドバビブベボパピプペポ" +
             "ァィゥェォッャュョ")

result = ''.join(random.choices(chars, k=5))

print(result) #出力例 イャムギォ

メモ:この例で生成されない カタカナ の例は「ヱ」、「ヴ」、「ヵ」(小さい カ)、「ヶ」(小さい ケ)など

メモ:Unicode で定義されている全カタカナは Katakana  で確認できます。

 

 

漢字 からなるランダムな5文字を生成する (Unicode版)

この例では、UnicodeのCJK統合漢字で定義されている範囲でランダムな5文字を生成します。この範囲には日本で使用されていない漢字も含まれます。

import random

result = ''.join(chr(random.choice(range(0x4E00, 0x9FD5))) for _ in range(5))

print(result) #出力例 杌鯜绛菮励

メモ:この例でUnicode の 4E00 から 9FD5 の範囲にある約2万文字の漢字からランダムな5文字を生成します。この範囲の漢字の一覧は CJK Unified Ideographs(CJK統合漢字) で確認できます。この約2万文字はUnicodeで最も主要な漢字の集合です。この中には日本では使用されない漢字も含まれます。(Unicodeでは日本で使用されている漢字だけの集合は定義されていません。)

 

 

漢字 からなるランダムな5文字を生成する (Shift_JIS版)

この例では、Shift_JIS で定義されている漢字の範囲でランダムな5文字を生成します。

import random

result = ''

for i in range(5):

    while(True):
        #漢字の範囲を 0x889F~0x9FFF と 0xE040~0xEAA4 に2分して考える。
        #この範囲内でランダムな値を生成する。
        code = random.randint(0x889F, 0x9FFF + (0xEAA4 - 0xE040))
        if code > 0x9FFF:
            code = code - 0x9FFF + 0xE040

        c = code.to_bytes(2 if code > 0xFF else 1 , 'big').decode('shift_jis','replace')

        if ord(c[0]) != 0xFFFD:
            break

    result = result + c


print(result) #出力例 健哂舌畜奴

 

 

指定した複数の文字 からなるランダムな 5文字を生成する

この例では、一例として「あいうえおカキクケコ東西南北🗼🗿🗾」の中からランダムな1文字を選択します。

import random

chars = list("あいうえお" +
             "カキクケコ" +
             "東西南北" +
             "🗼🗿🗾")

result = ''.join(random.choices(chars, k=5))

print(result) #出力例 🗿🗼キ🗿う

 

 

文字種を限定せずランダムな 15文字を生成する(Unicode版)

この例ではUnicodeで定義されている文字からランダムに15文字を選んで文字列を生成します。

import random

result = ''

#文字がフォントに収録されているかチェックする場合は有効にします。fonttoolsが必要です。メモ欄参照。
#from fontTools.ttLib import TTFont
#cmap = list(TTFont(r'C:\Windows\Fonts\meiryo.ttc', fontNumber=0).getBestCmap())

for i in range(15):

    while(True):

        codePoint = random.randint(0x00020, 0x3134F) #Unicodeのほとんどの文字を対象にします。
        #codePoint = random.randint(0x00020, 0x0FFFD) #Unicodeの基本多言語面(通常使う文字群)を対象にします。

        if codePoint >= 0xD800 and codePoint <= 0xDFFF:
            #サロゲート領域は生成しないようにします。
            continue
        elif codePoint >= 0xE000 and codePoint <= 0xF8FF:
            #私用領域は生成しないようにします。
            continue

        #文字がフォントに収録されているかチェックする場合は有効にします。fonttoolsが必要です。メモ欄参照。
        #if codePoint not in cmap:
        #    #フォント「メイリオ」に収録されていない文字は生成しないようにします。
        #    continue

        result = result + chr(codePoint)
        break

#出力例(フォントのチェックが有効な場合) 茁挺凊蒽泌✜❸睜≃勨鱸ҢĊǓ井
print(result)

メモ:文字がフォントに収録されているかチェックする部分を実行するには、fonttools をインストールする必要があります。その一般的な方法は pip install fonttools コマンドの実行です。fonttoolsについてはこちらを参照してください。 https://fonttools.readthedocs.io/en/latest/

 

 

文字種を限定せずランダムな 15文字を生成する(Shift_JIS版)

この例では Shift_JIS で定義されている文字からランダムに15文字を選んで文字列を生成します。

import random

result = ''

for _ in range(15):

    while(True):

        code = random.randint(0x0020, 0xFFFF)
        b = code.to_bytes(4, 'big')
        b1 = b[2] #1バイト目
        b2 = b[3] #2バイト目

        if ((b1 == 0x00) 
            and ((b2 >= 0x20 and b2 <= 0x7E) or (b2 >= 0xA1 and b2 <= 0xDF))):
            #1バイト文字の場合、この範囲は文字が定義されているのでOK
            pass
        elif (
                 ((b1 >= 0x81 and b1 <= 0x9F) or (b1 >= 0xE0 and b1 <= 0xEF)) 
                 and 
                 ((b2 >= 0x49 and b2 <= 0x7E) or (b2 >= 0x80 and b2 <= 0xFC))
             ):
            #2バイト文字の場合、この範囲は文字が定義されているのでOK
            pass
        else:
            #その他の場合文字が定義されていないので生成しない。
            continue

        c = code.to_bytes(2 if code > 0xFF else 1 , 'big').decode('shift_jis','replace')

        if ord(c[0]) == 0xFFFD:
            #変換できない文字は生成しません。81B5 などが該当。
            continue

        result = result + c
        break

#出力例 ≦搖璞kリ粃咸著m主・塔顯齡鐘
print(result)

 

 

ランダムなパスワードを生成する

この例では、半角英数および指定した記号からなる15文字のランダムなパスワードを生成します。パスワード内には最低限5文字の記号が含まれます。パスワードに含まれる記号は変数 symbols で定義しています。

import string
import secrets
import random

passwordLength = 15 #生成するパスワードの文字数
numberOfNonAlphanumericCharacters = 5 #パスワードに最低限含まれる記号の文字数

#パスワードに含まれる可能性がある記号の一覧
symbols = "!@#$%^&*()_-+=[{]};:>|./?"

password = list(secrets.choice(string.ascii_letters + string.digits + symbols) for _ in range(passwordLength))

symbolCount = 0
for item in password:
    symbolCount += 1 if (item in symbols) else 0

additionalSymbolCount = numberOfNonAlphanumericCharacters - symbolCount

if (additionalSymbolCount > 0):
    for i in range(additionalSymbolCount): 

        while(True):
            index = random.randint(0, passwordLength - 1)
            if (password[index] not in symbols):
                break;

        password[index] = symbols[random.randint(0, len(symbols) - 1)]

strPassword = ''.join(password);
print(strPassword) #出力例 rSRP>fj$%@_XW/*

メモ:このプログラムは .NET Framework の System.Web.Security.Membership.GeneratePassword のリファレンスソースを参考にしています。