出于测试目的,我使用给定的种子创建随机数(即不基于当前时间)。
因此整个程序是确定性的。
如果发生什么事情,我希望能够快速恢复到事件发生“不久之前”的点。
因此我需要能够恢复System.Random
到之前的状态。
有没有办法提取种子来重新创建随机生成器?
符合此处给出的答案 https://stackoverflow.com/questions/8188844/is-there-a-way-to-grab-the-actual-state-of-system-random/8188878#8188878,我写了一个小类来帮助保存和恢复状态。
void Main()
{
var r = new Random();
Enumerable.Range(1, 5).Select(idx => r.Next()).Dump("before save");
var s = r.Save();
Enumerable.Range(1, 5).Select(idx => r.Next()).Dump("after save");
r = s.Restore();
Enumerable.Range(1, 5).Select(idx => r.Next()).Dump("after restore");
s.Dump();
}
public static class RandomExtensions
{
public static RandomState Save(this Random random)
{
var binaryFormatter = new BinaryFormatter();
using (var temp = new MemoryStream())
{
binaryFormatter.Serialize(temp, random);
return new RandomState(temp.ToArray());
}
}
public static Random Restore(this RandomState state)
{
var binaryFormatter = new BinaryFormatter();
using (var temp = new MemoryStream(state.State))
{
return (Random)binaryFormatter.Deserialize(temp);
}
}
}
public struct RandomState
{
public readonly byte[] State;
public RandomState(byte[] state)
{
State = state;
}
}
您可以在以下位置测试此代码LINQPad http://linqpad.net.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)