2011-11-18 20 views
8

Tôi muốn có thể nhận được trạng thái thực tế hoặc hạt giống hoặc bất kỳ System.Random nào để tôi có thể đóng ứng dụng và khi người dùng khởi động lại, nó chỉ "reseeds" nó với một lưu trữ và tiếp tục như nó chưa bao giờ đã đóng cửa.Có cách nào để lấy trạng thái thực tế của System.Random không?

Có thể không?

Sử dụng ý tưởng của Jon Tôi đã đưa ra điều này để kiểm tra;

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(); 
} 

Trả lời

10

Đó là serializable, vì vậy bạn có thể tìm thấy bạn chỉ có thể sử dụng BinaryFormatter và lưu các mảng byte ...

đang

mẫu:

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)); 
     } 
    } 
} 

Kết quả trên chạy mẫu là đầy hứa hẹn:

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

Phải thừa nhận rằng tôi không quan tâm đến việc tuần tự được tích hợp sẵn, nhưng nếu điều này là dành cho một lời reaso hack nhanh chóng và bẩn thỉu, nó sẽ không sao ...

+0

Tôi sẽ cố gắng ở bên cạnh mình, tôi sẽ giữ một mắt ở đây cùng một lúc – Fredou

+0

cảm ơn :-), hoạt động tốt, tôi không nghĩ đến việc serialization :-( – Fredou

+0

bằng cách xem tệp được tạo, có vẻ như Bạn có biết cách sửa lỗi này không? – Fredou

0

Tôi không phải là C# guy, vì vậy tôi không có tài nguyên để xem mã nguồn, nhưng hạt giống phải được lưu trữ trong lớp. Từ tài liệu của nó, lớp không được niêm phong, vì vậy bạn sẽ có thể tạo một lớp con. Trong lớp con này, bạn có thể tạo một hàm để trả về hạt giống hiện tại. Khi tắt ứng dụng của bạn, bạn có thể lưu hạt giống (tập tin? Cơ sở dữ liệu? Khỉ với bộ nhớ tốt?) Và sau đó tải nó trở lại khi bạn khởi động ứng dụng mới của mình.

Điều này có lợi ích bổ sung cho phép bạn khôi phục từ bất kỳ điểm đã lưu trước đó nào, vì mục đích dự phòng hoặc điều gì đó.

+0

Bạn có lý do để tin rằng hạt giống là một phần của API công cộng (hoặc được bảo vệ) của lớp không? Thừa kế sẽ không giúp ích nếu hạt giống là một chi tiết thực hiện riêng tư, các lớp dẫn xuất sẽ không có quyền truy cập. –

+0

@Anthony Tôi đã nói rằng tôi không có mã nguồn. Tôi cho rằng tôi có thể đã rõ ràng khi nói rằng tôi không có bằng chứng kết luận để hỗ trợ điều đó, vì vậy không, tôi không có. Đối với tôi, có vẻ như điều gì đó hợp lý để đưa vào API được bảo vệ của bạn. – corsiKa

+0

Tôi sẽ xem xét điều này, vì tôi không thích những gì tôi thấy trong tệp đã lưu từ serialization – Fredou

Các vấn đề liên quan