Python
 Computer >> コンピューター >  >> プログラミング >> Python

【Python入門】特定の文字列に一致するまでランダムな文字列を自動生成する方法

はじめに

ある文字列が与えられたとき、英小文字・大文字・数字・記号などをランダムに組み合わせた文字列を生成し続け、最終的に元の文字列と完全に一致する文字列が作られるまで繰り返す、という処理をPythonで実装してみましょう。

この手法は「無限の猿の定理(Infinite Monkey Theorem)」をシミュレートするプログラムとしても知られており、ランダム性と反復処理の仕組みを学ぶのに絶好の題材です。

処理の流れ(アルゴリズム)

  1. ステップ1: 目標となる文字列を入力として受け取る。
  2. ステップ2: 英小文字・英大文字・数字・特殊文字など、使用可能なすべての文字を変数に格納する。
  3. ステップ3: ループと random 関数を使って、文字や記号のあらゆる組み合わせからランダムな文字列を生成する。
  4. ステップ4: 生成したランダムな文字列を1文字ずつ目標の文字列と照合し、一致した部分はそのまま固定する。
  5. ステップ5: 一致しなかった位置のみ再びランダムな文字を選び直して、全文字が一致するまで繰り返す。

サンプルコード

以下が実際の実装例です。string モジュールで候補となる文字集合を作り、目標文字列と一致した桁は固定しながら、残りの桁だけをランダムに更新していきます。

import string
import random
import time

# 使用可能な文字:英小文字 + 数字 + 英大文字 + 記号
my_possibleCharacters = string.ascii_lowercase \
    + string.digits \
    + string.ascii_uppercase \
    + ' ., !?;:'

t = "ab"  # 目標の文字列

# 初回のランダム文字列を生成
my_attemptThis = ''.join(random.choice(my_possibleCharacters)
                         for i in range(len(t)))
my_attemptNext = ''
com = False
iteration = 0

# 全文字が一致するまで繰り返す
while com == False:
    print(my_attemptThis)
    my_attemptNext = ''
    com = True
    for i in range(len(t)):
        if my_attemptThis[i] != t[i]:
            com = False
            my_attemptNext += random.choice(my_possibleCharacters)
        else:
            # 一致した文字はそのまま保持
            my_attemptNext += t[i]
    iteration += 1
    my_attemptThis = my_attemptNext
    time.sleep(0.1)

print("String matched after " + str(iteration) + " iterations")

実行結果の例

目標文字列が "ab" の場合、実行すると次のように毎回異なるランダムな2文字が出力され、徐々に正解へ近づいていきます。

36
G
sM
,L
jt
g1
FN
uR
;W
Ja
3n
4o
Gl
kY
NR
oR
Nw
Lg
Jt
Od
wN
z0
J
3a
9J
sF
v
g6
HO
Ia
AB
Xa
OX
:N
Wo
Dp
f;
tt
kf
Er
In
ou
bD
T
a0
aH
aW
a
a8
ai
ax
az
aN
aJ
ah
a0
a.
aq
ar
ax
ai
am
a;
aO
as
a;
aS
aL
aQ
a8
a3
ae
a5
aS
ao
al
aV
ar
aj
aT
aS
ad
ab
String matched after 83 iterations

ポイント解説

  • 文字の固定化: 一度正解した桁(この例では先頭の a)は上書きせず保持するため、出力を見ると徐々に目標文字列へ収束していく様子がわかります。
  • iteration カウント: 何回の試行で一致したかを記録しておくことで、ランダム探索にかかるコストを体感できます。
  • time.sleep(0.1): 各イテレーション間に0.1秒の待機時間を設けることで、生成過程を目視で確認しやすくしています。
  • 計算量に注意: 文字列が長くなると組み合わせの総数は爆発的に増えるため、短い文字列での動作確認に適しています。

まとめ

この記事では、Pythonの random モジュールと string モジュールを活用し、目標の文字列に一致するまでランダムな文字列を生成し続けるプログラムを紹介しました。シンプルながら「ループ処理」「条件分岐」「文字列操作」という基礎的な要素がすべて詰まった、学習価値の高いサンプルです。ぜひ自分でも文字列を変えて試してみてください。

  1. Pythonでランダムなビット列を生成する方法をわかりやすく解説

    Pythonでは、標準ライブラリの random モジュールに含まれる getrandbits() 関数を使うことで、指定したビット数のランダムなビット列(整数値)を簡単に生成できます。この関数は引数としてビット数を受け取り、その範囲内のランダムな整数を返します。基本的な使い方以下は、128ビットのランダムな値を生成し、16進数形式で表示する例です。import random hash = random.getrandbits(128) print(hex(hash))実行結果このコードを実行すると、実行するたびに異なる128ビットのランダムな16進数文字列が出力されます。0xa3fa6d9

  2. Pythonで複数行の文字列を作成する方法【初心者向け】

    Pythonで複数行にわたる長い文字列を作成したい場合、通常のシングルクォート()やダブルクォート() を1組使う代わりに、三重引用符(トリプルクォート)を使用します。シングルクォート3つ()でもダブルクォート3つ()でも動作しますが、一般的にはダブルクォート3つがよく使われます。基本的な書き方以下のように、開始と終了をそれぞれ3つのクォートで囲むだけで、改行を含む文字列をそのまま定義できます。multiline_str = My multi-line string print(multiline_str)このコードを実行すると、次のような出力が得られます。My multi-line st