Tôi cố gắng để sử dụng phương pháp C++ 11 này sang thế hệ số ngẫu nhiên:Làm cách nào để đặt lại một công cụ số ngẫu nhiên?
#include <random>
#include <functional>
#include <iostream>
int main(int argc, char *argv[])
{
std::normal_distribution<double> normal(0, 1);
std::mt19937 engine; // Mersenne twister MT19937
auto generator = std::bind(normal, engine);
int size = 2;
engine.seed(0);
normal.reset();
for (int i = 0; i < size; ++i)
std::cout << generator() << std::endl;
std::cout << std::endl;
engine.seed(1);
normal.reset();
for (int i = 0; i < size; ++i)
std::cout << generator() << std::endl;
std::cout << std::endl;
engine.seed(0);
normal.reset();
for (int i = 0; i < size; ++i)
std::cout << generator() << std::endl;
return 0;
}
Đầu ra là:
0.13453
-0.146382
0.46065
-1.87138
0.163712
-0.214253
đó có nghĩa là người đầu tiên và trình tự thứ ba là không giống nhau ngay cả khi chúng được gieo với cùng một số. Làm ơn, tôi đang làm gì sai? Có phải là
std::normal_distribution<double>
Chỉ cần một hàm theo nghĩa toán học (tạo ra y ngoài x xác định) hoặc tôi thiếu gì đó không? Nếu nó chỉ là một hàm, thì phương thức reset sẽ thực sự làm gì?
Đó là nó. Tôi đoán tôi phải học STL nhiều hơn nữa :) Nó hoạt động hoàn hảo với giải pháp của bạn. Cảm ơn! –
'auto generator = std :: bind (bình thường, std :: ref (engine));' là đủ tôi đoán. – Tengis