【Defold】アプリケーションを再起動せずに、毎回同じ乱数を生成する
Defold Engine で乱数を取得するには math.random を使用します。
function init(self)
-- シード値を初期化
math.randomseed(os.time())
-- 乱数の取得
local result = math.random(min, max)
-- Console へ出力
print("result" .. result)
end
使い方はとてもシンプル。これ以外のものは多分ありません。ひとつ気になることがあるとすれば、アプリケーションを再起動せずに、毎回同じ乱数を生成するにはどうすれば良いのか?といった点くらいです。気になりましたので検証してみました。
目次
検証
local M = {}
function M.new(seed)
local instance = {}
instance.prev_seed = 9999;
function instance.reset()
math.randomseed(instance.prev_seed)
end
function instance.set_seed(seed)
math.randomseed(seed)
instance.prev_seed = seed;
end
function instance.range(min, max)
return math.random(min, max)
end
instance.set_seed(seed)
return instance
end
return M
シード値をリセットしやすい様にラッパーを用意しました。ファイルはAssets/main/mira/random.lua へ配置しています。
テストコード
local mira_random = require("mira.random.random")
function init(self)
self.state = mira_random.new(os.time())
for i = 1, 5 do
self.state.reset();
for j = 1, 10 do
local value = self.state.range(1, 10)
print("index " .. i .. "=" .. value)
end
print("\n")
end
end
シード値を os.time で初期化し、range で取得する前に一度 reset を呼び seed 値を再設定しています。
結果
DEBUG:SCRIPT: index 1=2
DEBUG:SCRIPT: index 1=9
DEBUG:SCRIPT: index 1=4
DEBUG:SCRIPT: index 1=9
DEBUG:SCRIPT: index 1=10
DEBUG:SCRIPT: index 1=7
DEBUG:SCRIPT: index 1=5
DEBUG:SCRIPT: index 1=8
DEBUG:SCRIPT: index 1=9
DEBUG:SCRIPT: index 1=8
DEBUG:SCRIPT:
DEBUG:SCRIPT: index 2=2
DEBUG:SCRIPT: index 2=9
DEBUG:SCRIPT: index 2=4
DEBUG:SCRIPT: index 2=9
DEBUG:SCRIPT: index 2=10
DEBUG:SCRIPT: index 2=7
DEBUG:SCRIPT: index 2=5
DEBUG:SCRIPT: index 2=8
DEBUG:SCRIPT: index 2=9
DEBUG:SCRIPT: index 2=8
DEBUG:SCRIPT:
DEBUG:SCRIPT: index 3=2
DEBUG:SCRIPT: index 3=9
DEBUG:SCRIPT: index 3=4
DEBUG:SCRIPT: index 3=9
DEBUG:SCRIPT: index 3=10
DEBUG:SCRIPT: index 3=7
DEBUG:SCRIPT: index 3=5
DEBUG:SCRIPT: index 3=8
DEBUG:SCRIPT: index 3=9
DEBUG:SCRIPT: index 3=8
DEBUG:SCRIPT:
DEBUG:SCRIPT: index 4=2
DEBUG:SCRIPT: index 4=9
DEBUG:SCRIPT: index 4=4
DEBUG:SCRIPT: index 4=9
DEBUG:SCRIPT: index 4=10
DEBUG:SCRIPT: index 4=7
DEBUG:SCRIPT: index 4=5
DEBUG:SCRIPT: index 4=8
DEBUG:SCRIPT: index 4=9
DEBUG:SCRIPT: index 4=8
DEBUG:SCRIPT:
DEBUG:SCRIPT: index 5=2
DEBUG:SCRIPT: index 5=9
DEBUG:SCRIPT: index 5=4
DEBUG:SCRIPT: index 5=9
DEBUG:SCRIPT: index 5=10
DEBUG:SCRIPT: index 5=7
DEBUG:SCRIPT: index 5=5
DEBUG:SCRIPT: index 5=8
DEBUG:SCRIPT: index 5=9
DEBUG:SCRIPT: index 5=8
DEBUG:SCRIPT:
全く同じ順番で乱数を取得できました。どうやら math.randomseed(seed) を呼び出すことで、呼び出し回数も含め、綺麗な状態になる様です。