KMmacro Tips 第三弾です。
⇒ 第一弾の記事はこちら
⇒ 第二弾の記事はこちら
■ 乱数の生成
ちょーてきとうな疑似乱数の生成です。
KMmacro の演算精度とかわからないので(たぶん 32bit 整数演算なのかな?)、
とりあえず値域の制限された線形合同法とか使ってみます。
; 【SUB】"0~524286" の乱数生成ルーチン(途中の演算結果も31bitに収まるような線形合同法)
DIM %randomize_A %randomize_B %randomize_M
:RANDOMIZE
set %randomize_A 4096 ; AX+B が 31bit に収まるような数
set %randomize_B 5039 ; =7!-1 ※ n!-1 タイプの素数
set %randomize_M 524287 ; =2^19-1 ※メルセンヌ素数
set %randomSeed (mod (+ (* %randomSeed %randomize_A) %randomize_B) %randomize_M)
set %randomValue %randomSeed
if (or (<= %randomMax 0) (<= %randomize_M %randomMax)) goto :RANDOMIZE_END
set %randomValue (mod %randomValue (+ %randomMax 1)) ; 指定値域に丸める
:RANDOMIZE_END
set %randomMax 0 ; 念のためリセット
return
あらかじめメインルーチン側で変数宣言と乱数シードの初期化が必要です。
DIM %randomMax %randomSeed %randomValue ; RANDOMIZE ルーチン用(非保持)
set %randomMax 0
set %randomSeed (& "1" (date "nnss")) ; 現在時刻で乱数系列を初期化
使うときは、%randomMax
に上限値を設定して call するだけ。
%randomValue
にその上限値以下の乱数が設定されます。
たとえば、400ms 以下のランダムな時間だけ sleep したいときは
次のようなコードになります。
set %randomMax 400
call :RANDOMIZE
set %sleepPeriod %randomValue
call :SLEEP_WITH_YIELD
第二弾で紹介した関数 SLEEP_WITH_YIELD
を使ってます。
まぁ、マクロ内で乱数を使うようなケースは、待ち時間をランダムに変えて
「あたかも人間が操作しているようにみせかける」くらいしか使い道が
思いつかないですが、まぁ、そこは大人の了解で。
« KMmacro (その2) |
トップページ
| tmux 導入 »