最近在用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
不知道有没有更漂亮的写法?
作者:
LPH66 (-6.2598534e+18f)
2016-10-12 03:29:00他要的是跑到一半记录目前 PRNG 的 state 吧不过记得不少算法的 state 并不只有 seed 所以有点难提供一个统一界面, 例如 MT19937 需要 624 个 32 位元整数但种子只有 32 位元, 所以不可能用单一整数表示状态然后, 刚刚翻 Help 有看到 BlockRandom 或许也符合你的需要
谢谢楼上解释~MMA默认CA是80*64b,最小是64*64所以不可能用long描述, MMA的seed我觉得实际上是被hash处理过这方面我还在测试,不过想从这边retrive state也是很难BlockRandom只是freeze state而已,应该不能做到同时跑两个prng,更做不到resume吧@@其实有种最偷懒的做法是每次要存盘的时候就另开一个kernel专门跑rng,用mathlink连到另一个MMA也许更clear忽然觉得这应该就是最佳解了@@唯一可惜的是还是得额外存一套distribution,跑MCMC有点浪费ram...