Introduction

ブログ内検索

  • このサイトの記事を検索 by Google

おすすめの一冊!

無料ブログはココログ

« KMmacro (その2) | トップページ | tmux 導入 »

2013-04-18

KMmacro (その3)


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 導入 »