【Defold】アプリケーションを再起動せずに、毎回同じ乱数を生成する

Defold, DEVELOP

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) を呼び出すことで、呼び出し回数も含め、綺麗な状態になる様です。

Posted by kazupon