math.randomの注意点

もしかしたらLuaを使う場合全般に共通することかも知れないが、検証してないのでNScripterに限定して話す。
まず、Luaを使って10〜99までの乱数を作って表示するスクリプトを組む。

00.txt(a)

*define
killmenu 7
killmenu 4
killmenu 2
game
*start
random
@
end

system.lua(a)

-- random
NSExec("_luasub random")
function NSCOM_random()
	for i = 1, 10 do
		NSExec('puttext "'..math.random(10, 99)..' /"')
	end
end

実行結果

二回起動してそのスクリーンショットを撮ってみる。

(a)一回目

(a)二回目


おわかりのように、同じ結果が出てしまう。
次に、00.txtの最終行を変更する。

00.txt(b)

*define
killmenu 7
killmenu 4
killmenu 2
game
*start
random
@
definereset

※system.luaは変わらず。
クリックすると再起動するので、クリック前とクリック後を比べてみる。

(b)一回目

(b)二回目

何がいいたいか
  1. Luaのネイティブ乱数を扱う場合は、ちゃんとmath.randomseed()で初期化を考慮しないと駄目だよ。
  2. defineresetした場合、Lua側の環境は保持されるよ。

多分、2の方が開発においては重要になるんじゃないかなあ。

追記

defineresetとkillmenuの相性がとてつもなく悪いなあ(笑)
00.txt(b)の実行結果を、メニューバーに着目して比べてみると面白い。これ、対処方法あるかな? defineresetを使わないのが唯一かな?