作業効率化のためにUWSCを使っています。
先日、「普段やっている作業はUWSCで乱数を使えれば簡単になる」と気が付き、早速調べてみました。
解決策はとてもシンプルなもの。さらに、それを使った様々な実戦例がとても面白いのです。
調べたことと、しょうもない実験の結果をまとめてみました。
UWSCで乱数を生成するには?
RANDOM関数を使います。
RANDOM(Range) // 0 <= X < Range の範囲にある乱数を返す
例えば、RANDOM(10)とすると、0~9までの整数が返されます。
1~10の乱数が欲しい場合は「+1」すればよいです。
RANDOM(10)+1 // 1~10の整数を返す
アルファベットでランダムな文字列を作るには?
UWSCでアルファベットの文字コードは、大文字の「A~Z」が「65~90」、小文字の「a~z」は「97~122」です。
ゆえに、その数値をRANDOM関数でを生成すればできます。
文字数の分だけループ処理すれば、例えばアルファベット100文字のランダムな文字列を作ることも可能です。
CHR(65 + RANDOM(26)) // 大文字のアルファベット1文字を返す
CHR(97 + RANDOM(26)) // 小文字のアルファベット1文字を返す
ちなみにKBD関数で出力したい場合は、直接文字コードを指定できます。
KBD(65 + RANDOM(26)) // 大文字のアルファベット1文字をキーボード出力する
KBD(97 + RANDOM(26)) // 小文字のアルファベット1文字をキーボード出力する
UWSCの乱数には偏りはないの?
ここからは個人的な興味の世界です。
「乱数」というと常につきまとうのが「偏り」について。
というわけで、実験してみました。
実験のデザイン
RANDOM(10)を1万回ループさせる。
それを10セット、計10万回行う。
「0~9」それぞれの出力数と、連続出力回数を数える。
実験の結果
それぞれの出力数
縦が試行回数、横が出た数字
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |
~10000 | 977 | 963 | 1066 | 950 | 1012 | 1054 | 965 | 1001 | 1027 | 985 |
~20000 | 979 | 1015 | 947 | 991 | 954 | 1004 | 1034 | 1016 | 1051 | 1009 |
~30000 | 973 | 1012 | 967 | 1027 | 1039 | 963 | 998 | 1080 | 1021 | 920 |
~40000 | 1005 | 1037 | 961 | 1016 | 1019 | 1062 | 956 | 951 | 1023 | 970 |
~50000 | 965 | 994 | 992 | 990 | 1055 | 1003 | 980 | 1035 | 979 | 1007 |
~60000 | 995 | 1014 | 995 | 976 | 999 | 988 | 1013 | 1019 | 1017 | 984 |
~70000 | 955 | 982 | 987 | 1003 | 993 | 1034 | 1001 | 990 | 1025 | 1030 |
~80000 | 976 | 998 | 965 | 1004 | 1033 | 1003 | 1037 | 984 | 995 | 1005 |
~90000 | 989 | 994 | 961 | 1004 | 1035 | 984 | 1027 | 1009 | 1030 | 967 |
~100000 | 1046 | 1034 | 965 | 989 | 1022 | 1041 | 965 | 979 | 996 | 963 |
合計 | 9860 | 10043 | 9806 | 9950 | 10161 | 10136 | 9976 | 10064 | 10164 | 9840 |
連続出力回数
1回 | 2回 | 3回 | 4回 | 5回 | 6回 | |
~10000 | 8978 | 921 | 89 | 9 | 2 | 0 |
~20000 | 8961 | 938 | 94 | 5 | 1 | 0 |
~30000 | 9031 | 874 | 87 | 6 | 1 | 0 |
~40000 | 9053 | 846 | 86 | 14 | 0 | 0 |
~50000 | 8949 | 926 | 107 | 16 | 1 | 0 |
~60000 | 9004 | 893 | 90 | 9 | 3 | 0 |
~70000 | 9001 | 897 | 90 | 10 | 1 | 0 |
~80000 | 8942 | 947 | 98 | 10 | 2 | 0 |
~90000 | 9004 | 896 | 92 | 7 | 0 | 0 |
~100000 | 9014 | 896 | 82 | 7 | 0 | 0 |
合計 | 89937 | 9034 | 915 | 93 | 11 | 0 |
考察
1万回あたりの出力回数の最大値は「1080」、最小値は「920」と、160回の差がある。10万回だと最大値は「10164」、最小値は「9806」で、その差は358回。
1万回で1%程度の誤差が生じ、回数が多くなるほどそれは少なくなっていく。
専門的な知識はないが、おそらく統計学的に有意差なしと言えるだろう。
連続出力回数にも同じことが言え、回数が多くなるにつれ理論値に近づいていくことがわかった。
素人レベルなら何も考えずに関数を使って良いと考える。
まとめ
UWSCで乱数を生成するにはRANDOM関数を使えば良いです。
ちなみに、2020年現在、作者様のサイトが更新されておらず、今後もUWSCが使い続けられるかは分かりません。
別の自動化する手段も模索しないといけませんね。