有没有办法获取System.Random的实际状态?

我希望能够获得实际的状态或种子或System.Random的任何内容,以便我可以关闭一个应用程序,当用户重新启动它时,它只是将其“重新安置”它与存储的一个并继续,就像它从未关闭。

可能吗?

使用Jon的想法,我想出来测试它;

static void Main(string[] args) { var obj = new Random(); IFormatter formatter = new BinaryFormatter(); Stream stream = new FileStream("c:\\test.txt", FileMode.Create, FileAccess.Write, FileShare.None); formatter.Serialize(stream, obj); stream.Close(); for (var i = 0; i < 10; i++) Console.WriteLine(obj.Next().ToString()); Console.WriteLine(); formatter = new BinaryFormatter(); stream = new FileStream("c:\\test.txt", FileMode.Open, FileAccess.Read, FileShare.Read); obj = (Random)formatter.Deserialize(stream); stream.Close(); for (var i = 0; i < 10; i++) Console.WriteLine(obj.Next().ToString()); Console.Read(); } 

它是可序列化的,所以你可能会发现你可以使用BinaryFormatter并保存字节数组……

示例代码:

 using System; using System.IO; using System.Runtime.Serialization.Formatters.Binary; public class Program { public static void Main(String[] args) { Random rng = new Random(); Console.WriteLine("Values before saving..."); ShowValues(rng); BinaryFormatter formatter = new BinaryFormatter(); MemoryStream stream = new MemoryStream(); formatter.Serialize(stream, rng); Console.WriteLine("Values after saving..."); ShowValues(rng); stream.Position = 0; // Rewind ready for reading Random restored = (Random) formatter.Deserialize(stream); Console.WriteLine("Values after restoring..."); ShowValues(restored); } static void ShowValues(Random rng) { for (int i = 0; i < 5; i++) { Console.WriteLine(rng.Next(100)); } } } 

样本运行的结果很有希望:

 Values before saving... 25 73 58 6 33 Values after saving... 71 7 87 3 77 Values after restoring... 71 7 87 3 77 

不可否认,我并不热衷于内置的序列化,但如果这是一个相当快速和肮脏的黑客,它应该没关系......

我不是C#的人,所以我没有资源来查看源代码,但种子必须存储在类中。 从它的文档中,类没有被密封,所以你应该能够创建一个子类。 在此子类中,您可以创建一个函数来返回当前种子。 关闭应用程序后,您可以保存种子(文件?数据库?具有良好内存的猴子?),然后在启动新应用程序时将其重新加载。

这具有额外的好处,允许您从任何以前保存的点恢复,用于备份或其他目的。