2013-04-07 38 views
5

tôi cần để có thể tiết kiệm/trạng thái tải của máy phát điện ngẫu nhiên tăng này:thay thế nhanh hơn so với sử dụng các luồng lưu thúc đẩy phát ngẫu nhiên trạng thái

boost::variate_generator<boost::mt19937, boost::random::uniform_real_distribution<> > generator; 

tôi làm điều đó theo cách này:

std::ostringstream content; 
content << this->generator.engine(); 

Vấn đề là, điều này là cực kỳ chậm, không phải là có một số cách khác để lưu trữ nó? (Hoặc truy cập dữ liệu máy phát ngẫu nhiên ở định dạng gốc). Mã này được đóng gói trong lớp RandomGenerator của chúng tôi, vì vậy nó có thể hơi khó chịu.

+0

Quá trình ghi này mất khoảng 0,13 mili giây trên máy Mac mini 2,26 GHz của tôi. Làm thế nào nhanh chóng nó cần phải được? – rhashimoto

+4

Tôi không biết, 293800 Chu trình CPU có vẻ như là một thời gian dài! – Yakk

+0

Có vẻ như cách duy nhất để lưu và khôi phục trạng thái là thông qua luồng. Để cải thiện hiệu suất, bạn có thể viết luồng tùy chỉnh của riêng mình (kế thừa từ 'std :: streambuf') và đọc vào đó hoặc xem xét boost :: iostreams. –

Trả lời

1

Một vài phương pháp tiếp cận, cả hai khá hacky:

  1. Chỉ cần lấy các byte thô sử dụng một cái gì đó như:

    typedef typename std::aligned_storage<sizeof(boost::mt19937)>::type mt19937_storage; 
    mt19937_storage storage; 
    std::memcpy(&storage, &generator, sizeof(generator)); 
    //... 
    generator.engine() = *reinterpret_cast<boost::mt19937*>(storage); 
    

    này hoạt động tốt cho trong bộ nhớ lưu trữ và tải, nhưng chính xác định dạng rõ ràng sẽ là trình biên dịch và kiến ​​trúc phụ thuộc, vì vậy nó sẽ không hoạt động nếu bạn cần sự lưu giữ di động. Để biết thêm các điểm thận trọng, bạn có thể ném một số static_assert cho một số nội dung như is_trivially_copyable để bảo vệ chống lại (không) các thay đổi trong tương lai đối với mt19937.

  2. Giả sử các điều khoản của giấy phép Tăng cường được chấp nhận (có thể là), hãy sao chép mẫu mersenne_twister của Boost và tinh chỉnh nó để chấp nhận con trỏ đến mảng trạng thái và tham chiếu đến chỉ mục mảng. Sau đó, nhà nước là hoàn toàn bên ngoài động cơ, và bạn có thể quản lý nó bất kỳ cách nào bạn muốn.

Ngẫu nhiên, nếu điều này là một hoạt động rất thường xuyên và bạn không cần phải uber-chiều cao đồng đều MT19937, bạn có thể xem xét sử dụng một different engine với yêu cầu nhà nước nhỏ hơn, chẳng hạn như taus88.

+0

Phải, chu kỳ dài 2^19937-1 là nhiều hơn chúng ta cần, và taus88 có kích thước nhỏ hơn 200 lần, vì vậy tôi sẽ thử nó :) – kovarex