2011-11-18 4 views
8

実際の状態やシード、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(); 
} 

答えて

10

あなたはあなただけ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 

確かに私は組込みシリアル化に熱心ではありませんが、これがreaso素早く汚れたハックは、大丈夫でしょう...

+0

私は私の側で試してみます、私は同時にここで目を維持します – Fredou

+0

ありがとう:-)、うまく働く、私は直列化の考えていない:-( – Fredou

+0

は、 – Fredou

0

私はC#の人ではありませんので、ソースコードを見るためのリソースはありませんが、その種子はクラスに保存する必要があります。そのドキュメントからクラスは密封されていないので、サブクラスを作ることができるはずです。このサブクラスでは、現在のシードを返す関数を作成できます。あなたのアプリケーションのシャットダウン時に、シード(ファイル?データベース?良い記憶を持つサル)を保存してから、新しいアプリを起動するときにそれを読み込むことができます。

これには、バックアップ目的などのために、以前に保存したポイントから復元できるという利点があります。

+0

シードがクラスの公開(または保護された)APIの一部であると考えられる理由はありますか?種がプライベートな実装の詳細である場合、継承は助けにならず、派生したクラスはアクセスできません。 –

+0

@Anthony私はソースコードを持っていないと述べました。私は、私がそれをサポートする決定的な証拠を持っていないと言って明示的に言えるかもしれないと思うので、そうではありません。私には、あなたの保護されたAPIに論理的に何かが含まれているようです。 – corsiKa

+0

シリアス化されたファイルに表示されているものが好きではないので、これを調べてみましょう。 – Fredou

関連する問題