ランダム文字列の生成
このところ,何度かサーバーをインストールする機会がありました。その際いくつかのソフトウェアをインストールするとき,ランダムな文字列を設定ファイルに書き込む必要がありました。例えば,このブログのソフトウエアであるwordpressのインストールには,その設定ファイルに65個のランダム文字列を8種類入力する必要があります。また,データベースを管理するソフトウエア,phpMyAdminのインストール時にもランダムな文字列の設定が求められます。
勿論ランダムな文字列を入れれば良いので,手で適当に入力しても間に合います。また,そのような文字列を生成するツールも用意されている場合もあります。
しかし,作成プログラムを自分で作ってみたくなるのも事実です。実際,ランダム文字列の作成は色々な状況で起きるので,類似のプログラムは実は何度も作っています。ここでは,その簡単なひな形を紹介します。小さなプログラムで,少しの手直しで,色々に対応できます。
基本のひな形
アイデアはとても簡単です。選ぶ文字の集合を決めて,その集合の中からランダムに文字を選択することを繰り返すだけです。
選ぶ文字の集合
例えば,文字ABCDEFGから選ぶとして,その集合を数学の記号で表すと{A,B,C,D,E,F,G}となります。しかし,残念ながらtbasicには,集合という対象はありません。そこで,その代わりに,文字列”ABCDEFG”を使うことにします。勿論,集合と文字列は別な対象ですが,文字列にもその中の一つの文字を取り出すという操作が可能です。ですから,文字列でも選ぶ文字の集合としての役割を果たせます。具体的には,Mid$関数を使うと,文字列”ABCDEFG”から,例えば,”E”を選ぶことは,Mid$(“ABCDEFG”,5,1)で可能です。
一般に文字列T$から,n番目の文字を選ぶには,Mid$(T$,n,1)によって可能です。ですから,文字の集合からランダムに文字を選ぶことは,文字の集合の元で文字列を作り,その文字列の中から,ランダムに一つ選ぶことと同じになります。
例えば上の例で,{A,B,C,D,E,F,G}からランダムに一つの文字を選ぶことは,文字列”ABCDEFG”からランダムに一つの文字を選ぶこと。そしてこれはMid$関数を使えば,1から7の間の数をランダムに選ぶことと同じになります。
ランダムに取り出す
ランダムに取り出す操作は,Rnd関数を使います。Rnd関数は0≦x<1となる数xをランダムに与えます。ランダムな数を与えるのが関数と言うのは違和感を感じますが,正確に言えば,Rnd関数はランダムに見える数を与える関数です。Rnd関数は0≦x<1となる数xを与える関数ですが,例えば7倍すると,0≦7x<7をですから,使って,例えば,1から7の間の数をランダムに得るには,Int(7*Rnd)+1を使います。切り上げ関数Ceilを使ってCeil(7*Rnd)としても同じです。
一般に,1からmまでの間の自然数をランダムに得るには,Int(m*Rnd)+1または,Ceil(m*Rnd)によって可能です。
この操作を繰り返せば,ランダムな文字列を取り出すことができるような気がします。しかし少し問題があります。Rnd関数はランダムに数を出力するのではなく,ランダムに近い数を出力します。正確には,Rnd関数は初期値(シード:種)から,順次決まった数列を出力します。tbasicの場合,プログラム実行時にRnd関数に決まった初期値を設定します。ですから,プログラムを実行後最初のRnd関数の値はいつも同じです。ですから,繰り返しで出力される数の列はいつも同じです。初期値が同じなら,同じ数が出力されますから,これを避ける必要があります。それには初期値を色々と変化させれば可能です。その処理を行うのがRandomizeです。
Randomize
Randomizeは,Rnd関数の初期値を設定します。 Randomize x の書式も使えますが,これは特別な時に使うもので,普通は Randomize の形で使います。これは内蔵時計の時刻を使って初期化する方法で,簡単ですが,適切な方法です。Rnd関数を使い始めるとき,一回使うだけで十分です。
以上のことを注意すると,プログラムは簡単に書けます。
まず,ランダムに選ぶ文字列の集合を決め,それを文字列で表します。これを例えば,RandChS$としましょう。上の例,{A,B,C,D,E,F,G}からランダムに一つの文字を選ぶ場合ならば,RandChS$=”ABCDEFG”です。その個数をNumRChSとします。NumRChS=Len(RandChS$)です。求めるランダム文字列をRndStr$,その長さをLenRStrとします。
プログラムの構成はRandChS$を決め,LenRStrを決めて,上の基本のひな形を使えば良いだけです。例えば次のようにプログラムが書けます。
プログラム例
RandChS$ = "0123456789" RandChS$ = RandChS$ + "abcdefghijklmnopqrstuvwxyz" RandChS$ = RandChS$ + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" LenRStr = 20 NumRChS = Len(RandChS$) Randomize RandStr$ = "" For i = 1 To LenRStr r = Ceil(NumRChS * Rnd) RandStr$ = RandStr$ + Mid$(RandChS$,r,1) Next i Print RandStr$
ここで,RandChS$は,”0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ”ですが,長いので,見やすいように3行で設定しています。RandChS$の指定を変えることで,色々なランダム文字列を生成できます。
上のプログラムは簡単なものですが,状況に合わせ,少しの手直しで,色々な状況に活用できます。