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

时间:2011-11-18 20:43:09

标签: c# .net 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();
}

3 个答案:

答案 0 :(得分:11)

它是可序列化的,所以您可能会发现只能使用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

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

答案 1 :(得分:0)

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

这样做的另一个好处是允许您从之前保存的任何点进行恢复,以用于备份或其他目的。

答案 2 :(得分:0)

这是我在我的静态实用程序类中想到的:

my-app.com/extracted-zip/index.html