〜 ナンバー 〜
文字列をランダムに生成

HSPに乱数発生命令(関数)がありますが、取得できるのは「0〜32767」の値だけです。
時には「文字列によるパスワード生成ツール」のように数値ではなく、
記号やアルファベット等の予測できない文字列を取得したい場合もあるでしょう。
取得方法はいろいろとあるわけですが、参考として幾つか載せておきます。
1つは、予め文字列のカケラとなるものを配列に入れておき、ランダム文字列生成時に組み合わせる方法。
この方法だと、文字にしろ記号にしろ、利用される文字種を制限でき、
また、完全なランダムではなくある程度のパターンを持たせることが可能です。
ただし、かなりの数を用意しておかなければ、パターンが単調になり、推測されやすくなるかもしれません。
他に、ASCIIコードを利用する方法もあります。
コードは一定の並びとなっていますので、記号だけ、とか英小文字だけ、とかの文字種制限を、
peek命令、poke命令等のメモリ操作命令(関数)を使用することで比較的簡単に操作することができます。
また、使用する文字範囲を指定しておくだけで、前者のように予め何かを用意しておかなくとも、
文字数が多ければ、組み合わせ無限大と言っても過言ではありません。
その代わり、ある程度のパターンを持たせることは困難になります。
さて、サンプルモジュールですが、HSP2版は上記の前者、ある程度のパターンを定義しておくもの、
HSP3版は後者のASCIIコード範囲の制御により、指定コード種を制限するタイプのものです。
パターン文字列であったり、コード範囲制御の方法はご自分で変更してみてくださいね。
	

srnd 長さ
長さ生成文字列の長さを指定する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#module
#deffunc srnd int
	mref len, 0
	mref rstr, 65
	// 文字数に応じて、3種をそれぞれ10パターン用意
	sdim pattern, 4, 10, 3
	pattern.0.0 = "8", "*", "7", "A", "G", "P", "R", "V", "X", "Z"			// 1文字パターン
	pattern.0.1 = "aL", "cO", "fV", "kX", "mQ", "q3", "uA", "wT", "y2", "zU"		// 2文字パターン
	pattern.0.2 = "Mb9", "@dB", "SeY", "!hF", "EiQ", "#jM", "GnS", "Ho6", "IsP", "Kt%"	// 3文字パターン
	// 生成
	rstr = ""
	repeat
		strlen i, rstr
		if i >= len : break						// 生成完了
		rnd pr, (len - 3 >= i) + (len - 2 >= i) + (len - 1 >= i)	// 残数でパターンを変更
		rnd nr, 10
		rstr += pattern.nr.pr
	loop
	return
#global

	randomize
	repeat
		redraw 0
		color 255, 255, 255 : boxf : color
		pos 10, 10
		srnd  2 : mes "ランダム2文字結果  : " + refstr
		srnd  5 : mes "ランダム5文字結果  : " + refstr
		srnd  8 : mes "ランダム8文字結果  : " + refstr
		srnd 23 : mes "ランダム23文字結果 : " + refstr
		redraw
		wait 300
	loop

結果 = srnd(長さ, タイプ)
結果生成したランダム文字列の格納先を指定する。
長さ生成文字列の長さを指定する。
タイプ使用したい文字タイプ(0:記号 1:数字 2:英大文字 4:英小文字)合計値を指定する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#module
#defcfunc srnd int len, int type, local types, local typee, local rstr, local code
	dim types, 4 : types = '!', '0', 'A', 'a' // タイプ開始コード
	dim typee, 4 : typee = '~', '9', 'Z', 'z' // タイプ終了コード
	// 生成
	sdim rstr, len + 1
	repeat len
		code = rnd(typee - types) + types // 文字コードは'!'(=33)から'~'(=126)までの93種
		// 指定タイプとの照合
		if ((type & 1) = 0) && (code >= types.1) && (code <= typee.1) : continue cnt
		if ((type & 2) = 0) && (code >= types.2) && (code <= typee.2) : continue cnt
		if ((type & 4) = 0) && (code >= types.3) && (code <= typee.3) : continue cnt
		poke rstr, cnt, code
	loop
	return rstr
#global

	randomize
	repeat
		redraw 0
		color 255, 255, 255 : boxf : color
		pos 10,  10 : mes "記号のみ"
		mes "2文字パターン : " + srnd(2, 0)
		mes "5文字パターン : " + srnd(5, 0)
		mes "8文字パターン : " + srnd(8, 0)
		pos 10, 100 : mes "記号と数字のみ"
		mes "2文字パターン : " + srnd(2, 1)
		mes "5文字パターン : " + srnd(5, 1)
		mes "8文字パターン : " + srnd(8, 1)
		pos 10, 200 : mes "記号と英大文字のみ"
		mes "2文字パターン : " + srnd(2, 2)
		mes "5文字パターン : " + srnd(5, 2)
		mes "8文字パターン : " + srnd(8, 2)
		pos 10, 300 : mes "記号と英小文字のみ"
		mes "2文字パターン : " + srnd(2, 4)
		mes "5文字パターン : " + srnd(5, 4)
		mes "8文字パターン : " + srnd(8, 4)
		pos 10, 400 : mes "記号と英字のみ"
		mes "2文字パターン : " + srnd(2, 6)
		mes "5文字パターン : " + srnd(5, 6)
		mes "8文字パターン : " + srnd(8, 6)
		redraw
		wait 300
	loop