最近在用MMA跑Monte Carlo,覺得MMA不能提取seed實在是很不方便,所以就做了一個可以
提取seed的RandomVariate
Module[{seed, store = {}, temp = 1, Storing},
RandomMemory[1, opt___] := RandomMemory[temp, opt];
RandomMemory[in__] := (Storing[in]; RandomVariate[in]);
Storing[dist_, opt___] :=
AppendTo[
store, {Evaluate[If[dist === temp, 1, temp = dist]], opt}];
SetSeed[InSeed_, InStore_: {}] := (store = {}; temp = 1;
SeedRandom[seed = InSeed]; (RandomMemory[##];) & @@@ InStore;);
ExtractSeed[] := {seed, store}; SetSeed[0];];
這個設計在跑custom distribution的時候蠻好用的, 不過AppendTo會是瓶頸
目前只有想到hash, 不過有新distribution還是得重建table
不知道有沒有更漂亮的寫法?