Introduction

ブログ内検索

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

おすすめの一冊!

無料ブログはココログ

« 2013年3月 | トップページ | 2014年8月 »

2013年4月

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)


KMmacro Tips 第二弾です。

  ⇒ 第一弾の記事はこちら


■ いつでもキャンセルできる sleep

delay 命令を使えばカンタンに sleep できます。

しかし、その間はマクロ実行をキャンセルできない、という問題があります。

たとえば、

SetBreakkey [Shift] ; ESCはうまく効かないことがあるので…
としておいても、delay 命令の実行中に Shift キーを押してもキャンセルできません。 そこで、短時間の delay 命令を繰り返し実行する関数を使います。
:SLEEP_WITH_YIELD if (< %sleepPeriod 1) goto :SLEEP_WITH_YIELD_END if (< %sleepPeriod 200) goto :SLEEP_WITH_YIELD_LAST dec %sleepPeriod 200 delay 200 goto :SLEEP_WITH_YIELD :SLEEP_WITH_YIELD_LAST delay %sleepPeriod :SLEEP_WITH_YIELD_END set %sleepPeriod 0 ; 念のためリセット return
メインルーチンではあらかじめ変数宣言が必要です。
DIM %sleepPeriod ; SLEEP_WITH_YIELD ルーチン用(非保持)
あとは、delay 命令の代わりにこの関数を call するだけ。
set %sleepPeriod 5000 call :SLEEP_WITH_YIELD
これで5秒間 sleep しますが、その間いつでもマクロの実行をキャンセルできます。 上記の関数定義は独立ファイルにしておいて、各マクロで include するのがオススメです。

« 2013年3月 | トップページ | 2014年8月 »