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

フォローする

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
ダウンロード前に必ず『サンプルロボご利用にあたっての注意事項』をご一読いただき、
お客さま責任でご利用いただきますようお願いいたします。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー 

パスワードの作成など、ランダムな文字列を生成したい場合、関数を使用することで英数字(大文字、小文字、数字)を対象に生成することができます。

 ランダムな8文字の文字列を生成し変数に格納するロボットを例に説明します。

① random()関数を使用することで0~1の間の小数点以下10桁以内の値がランダムに返されます。

② 下記の式により①で返された値に6を乗算し、その値に対しceil()関数を使用することで端数を切り上げ、0
 ~6の整数を取得します。(※1)
  ceil(6* random())

③ ②で取得した値が0の場合は後続の処理から除外し、サイコロのような1~6の値によって下記の通り分岐し
 ます。(※2)
 ※10進数、16進数、英字の対応は下図の「英字と文字コード対応表」を参照してください。

・1~2の場合
 下記の関数を使用して65~90の10進数の値を取得し、16進数(41~5A)に変換。
  “OUTPUT = Number("+(ceil(26*random())+64+").toString(16)”

 下記の関数を使用して41~5A の16進数を英字に変換。「A~Z」の英大文字が生成される。
   “OUTPUT = String.fromCharCode(0x”+{16進数}+”)”

・3~4の場合
 下記の関数を使用して97~122の10進数の値を取得し、16進数(61~7A)に変換。
  “OUTPUT = Number("+(ceil(26*random())+96)+").toString(16)"

 下記の関数を使用して61~7Aの16進数を英字に変換。「a~z」の英小文字が生成される。
  "OUTPUT = String.fromCharCode(0x"+{16進数}+")"

・5~6の場合
 下記の関数を使用して0~9の数字をランダムに生成します。
  ceil(9 * random())

④ 生成した値を変数に格納し、8文字になるまで①~③を繰り返します。

 <英字と文字コード対応表>
1057_1.png


上記のロボットの詳しい作成手順は下記を参照してください。

8143_2.png


[前提条件]
①下記の4つの変数をロボットに設定してください。

・処理を分岐するためのランダムな数字を格納する変数
1057_3.png

・ループ回数を格納する変数
1057_4.png

・ランダムで生成された文字を一時的に格納する変数
1057_4.png

・ランダムな文字列の文字数を指定する変数
1057_5.png

②下記の1つの変数を含むタイプをロボットに設定してください。
なお、タイプ名は「ランダム文字列」とし、ロボット設定時に「グローバル」項目にチェックしてください。

・ランダムで生成された文字を蓄積する変数
1057_6.png

手順

1. 「繰り返し(Repeat)」ステップを追加する。

2. 「変数の割当(Assign Variable)」ステップを追加し、「値」項目にて「エクスプレッション」を選択し、下記の通り設定する。
  値:ceil(6 * random())
  変数:random

1057_8.png


手順2の結果として1/10億の確率でランダム関数が0を返す可能性があります。
今回はサイコロのような1~6の数字を返したいため、変数「random」の値が0の場合は後続の処理を全てスキップするように下記の手順3にて設定します。

3. 「値(Test Value)」判定ステップを追加し、「条件」項目にて「エクスプレッション」を選択し、下記の通り設定する。
  条件: random==0
  If:条件が満たされています
  Do:後続のステップをすべてスキップ

1057_9.png


4. 「変数の割当(Assign Variable)」ステップを追加し、「値」項目にて「エクスプレッション」を選択し、下記の通り設定する。
  値:count + 1
  変数:count

1057_10.png

5. トライ ステップを追加する。

 変数「random」に格納された値が1または2の場合とそれ以外の場合を分岐させ、1または2の場合は「A~Z」の大文字からランダムに生成するように以下の手順6~8の処理を行います。

6. 上段のブランチに「値判定(Test Value)」ステップを追加し、「値」項目にて「エクスプレッション」を選択し、下記の通り設定する。
  条件:random==1 || random==2
  If:条件が満たされていません
  Do:[エラー処理]時に指定されたとおり

1057_11.png

「エラー処理」タブにて下記の通り設定する。
  Then:次の代替手段を試行
  次のステップ:直近のトライステップ

1057_12.png

 7. 手順6にて変数「random」に格納された値が1または2以外の場合、次の手順8に進む際に「値判定(Test Value)」ステップにてエラーとなる為、「値判定(Test Value)」ステップを無効化する。

   手順6にて変数「random」に格納された数字から関数を使用して65~90までの10進数を取得し、
  その値を16進数に変換する処理を下記の手順8にて設定します。

8.  「変数の変換(Convert Variables)」ステップを追加する。

「変換」項目の「+」ボタンをクリックすると表示される「設定:変換」ダイアログにて下記の通り設定する。
  開始:text
  コンバータ:「その他」>「JavaScriptを使用して変換」

「設定:JavaScriptを使用して変換」ダイアログの「スクリプト」項目にて「エクスプレッション」を選択し、下記を入力する。
  "OUTPUT = Number("+(ceil(26*random())+64)+").toString(16)"

1057_13.png

「OK」ボタンをクリックして「設定:JavaScriptを使用して変換」ダイアログを閉じ、「設定:変換」ダイアログにて下記の通り設定する。
  終了:text

上記の変数「text」に格納された16進数を英大文字に変換するため、下記の処理を設定します。

「変数の変換(Convert Variables)」ステップにて、再度「変換」項目の「+」ボタンをクリックし、「設定:変換」ダイアログにて下記の通り設定する。
  開始:text
  コンバータ:「その他」>「JavaScriptを使用して変換」

「設定:JavaScriptを使用して変換」ダイアログの「スクリプト」項目にて「エクスプレッション」を選択し、下記を入力する。
  "OUTPUT = String.fromCharCode(0x" + text + ")"

1057_14.png

「OK」ボタンをクリックして「設定:JavaScriptを使用して変換」ダイアログを閉じ、「設定:変換」ダイアログにて下記の通り設定する。
  終了:text

9. 「変数の割当(Assign Variable)」ステップを挿入し、「値」項目にて「エクスプレッション」を選択し、下記の通り設定する。
  値:ランダム文字列.文字列+text
  変数:ランダム文字列.文字列

1057_15.png

手順9の処理により、変数「text」に格納された文字がループの回数ごとに変数「ランダム文字列」に蓄積されます。

文字数が8に達した場合はループを終了するように、下記の手順10の処理を行います。

10. 「値判定(Test Value)」ステップを挿入し、「条件」項目にて「エクスプレッション」を選択し、下記の通り設定する。
  条件:count==文字数
  If:条件が満たされています
  Do:[エラー処理]時に指定されたとおり

1057_16.png

「エラー処理」タブにて下記の通り設定する。
  Then:ループ終了
  次のステップ:直近のトライステップ

1057_17.png

11. 「次へ(Next)」ステップを追加する。

12.  変数「random」に格納された値が3または4の場合と5または6の場合の処理を分岐させるため、手順5のトライステップのブランチにトライステップを追加する。

1057_18.png

13. 「値判定(Test Value)」ステップを追加し、 「条件」項目にて「エクスプレッション」を選択し、下記の通り設定する。
  条件:random==3 || random==4
  If:条件が満たされていません
  Do:[エラー処理]時に指定されたとおり

1057_19.png

「エラー処理」タブにて下記の通り設定する。
  Then:次の代替手段を試行
  次のステップ:直近のトライステップ

1057_20.png

14. 手順13にて変数「random」に格納された値が3または4以外の場合、次の手順15に進む際に「値判定(Test Value)」ステップにてエラーとなる為、「値判定(Test Value)」ステップを無効化する。

手順13にて変数「random」に格納された数字から関数を使用して97~122までの10進数を取得し、その値を16進数に変換する処理を下記の手順15にて設定します。

15. 「変数の変換(Convert Variables)」ステップを追加する。

「変換」項目の「+」ボタンをクリックすると表示される「設定:変換」ダイアログにて下記の通り設定する。
  開始:text
  コンバータ:「その他」>「JavaScriptを使用して変換」

「設定:JavaScriptを使用して変換」ダイアログの「スクリプト」項目にて「エクスプレッション」を選択し、下記を入力する。
  "OUTPUT = Number("+(ceil(26*random())+96)+").toString(16)"

1057_21.png

「OK」ボタンをクリックして「設定:JavaScriptを使用して変換」ダイアログを閉じ、「設定:変換」ダイアログにて下記の通り設定する。
  終了:text

上記の変数「text」に格納された16進数を英小文字に変換するため、下記の処理を設定します。

「変数の変換(Convert Variables)」ステップにて、再度「変換」項目の「+」ボタンをクリックし、「設定:変換」ダイアログにて下記の通り設定する。
  開始:text
  コンバータ:「その他」>「JavaScriptを使用して変換」

「設定:JavaScriptを使用して変換」ダイアログの「スクリプト」項目にて「エクスプレッション」を選択し、下記を入力する。
  "OUTPUT = String.fromCharCode(0x"+text+")"

1057_22.png

「OK」ボタンをクリックして「設定:JavaScriptを使用して変換」ダイアログを閉じ、「設定:変換」ダイアログにて下記の通り設定する。
終了:text

16. 手順15の「変数の変換(Convert Variables)」ステップを、手順9の「変数の割当(Assign Variable)」ステップの前に接続する。

1057_23.png

17.  変数「random」に格納された値が5または6の場合の処理を設定するため、手順12のトライステップのブランチに「変数の割当(Assign Variable)」ステップを追加する。

1057_24.png

「値」項目にて「エクスプレッション」を選択し、ランダムな数字を割り当てるため、下記の通り設定する。
  値:ceil(9 * random())
  変数:text

1057_25.png

18. 手順17の「変数の割当(Assign Variable)」ステップを、手順9の「変数の割当(Assign Variable)」ステップの前に接続する。

1057_26.png

19.手順1の「繰り返し(Repeat)」ステップの前にブランチを追加する。

1057_27.png

20. 「値返却(Return Value)」ステップを追加し、下記の通り設定する。
  変数:ランダム文字列

21. 手順7と手順14の「値判定(Test Value)」ステップの無効化を解除する。

デバッグを実行すると、ランダムな英数字8文字が返されます。

<例>1回目の実行結果
1057_28.png

2回目の実行結果
1057_29.png

3回目の実行結果
1057_30.png

補足

・(※1)
  ceil()   …端数切り上げを表す関数。
  random() …0~1の間の小数点以下10桁以内を返す関数。

  <例>0.331511368 0.7660894848

  ceil(6* random())のうち、”6* random()”はrandom関数に6を掛けた値を求め、その値の端数を
  ceil関数によって切り上げることでサイコロのような1~6の数字をランダムに返します。


・(※2)
  ①65~90の10進数の値を取得する関数
    ceil(26*random())+64

   なお、上記の関数にて取得された65~90の10進数は、後述の関数にて英数字へ変換した場合、
   英大文字に変換されます(「英字と文字コード対応表」を参照)。
   英小文字を取得したい場合は97~122の10進数の値を取得する必要があるため、
   下記の関数となります。

  ②97~122の10進数の値を取得する関数
    ceil(26*random())+96

   また、エクスプレッションにて下記の関数を使用することでも小文字化が可能です。
   <例>変数「text」の値を小文字化する場合
    toLowerCase(text)

  ③10進数の値を16進数に変換する関数
    OUTPUT = Number({10進数の値}).toString(16)

  ④16進数を英字に変換する関数
    OUTPUT = String.fromCharCode(0x{16進数の値})

サンプルロボは下記リンク先よりダウンロードしてください。
ランダムな文字列を生成するサンプルロボット

0人中0人がこの記事が役に立ったと言っています

コメント

1件のコメント
  • 半角英数のみでランダムな文字列の生成ということであれば、「変数の割り当て」ステップのエクスプレッションでsubstring(guid(),0,8)を設定し、ランダムな文字列を入れた変数を構築し、ファイル圧縮の際のパスワードにしています。このguid()というのはグローバル一意識別子というもので8桁-4桁-4桁-4桁-12桁の半角英数を生成します。そこからsubstringで必要桁数を抽出しています。上記のようにきちんと制御された生成方法ではないですが、より簡便的な方法ではないかと存じます。(もちろん、9桁以上はハイフンが入るので、追加のsubstringなどで工夫してください。)

    1
    コメントアクション Permalink

記事コメントは受け付けていません。