2011-12-05 41 views
6

Khi chúng tôi đang sử dụng một bộ tạo số ngẫu nhiên trong C#, chúng ta có thể định nghĩa một biến nhưC++ tương đương với Random mới (hạt giống) trong C#

private Random _rndGenerator; 

trong một lớp và sau đó gọi

_rndGenerator = new Random(seed); 

một cách chính xác trong hàm tạo của lớp.

Câu hỏi của tôi là:

C++ tương đương với một định nghĩa như vậy (ví dụ: một RNG trong một lớp học) là gì. Tôi nghĩ rằng đó không phải là cách tiếp cận đúng để sử dụng

srand((unsigned int)seed); 

phải không?

Trả lời

14

C++ 11 có nhiều cơ sở tạo số ngẫu nhiên mạnh hơn. Dưới đây là ví dụ:

#include <random> 
#include <functional> 

std::size_t get_seed(); // whatever is the preferred way of obtaining a seed 

typedef std::mt19937 engine_type; // a Mersenne twister engine 
std::uniform_int_distribution<engine_type::result_type> udist(0, 200); 

engine_type engine; 

int main() 
{ 
    // seed rng first: 
    engine_type::result_type const seedval = get_seed(); 
    engine.seed(seedval); 

    // bind the engine and the distribution 
    auto rng = std::bind(udist, engine); 

    // generate a random number 
    auto random_number = rng(); 

    return random_number; 
} 

Có nhiều cách để lấy hạt. <random> cung cấp khả năng truy cập vào một số entropy phần cứng với lớp std::random_device, mà bạn có thể sử dụng để gieo hạt PRNG của bạn.

std::size_t get_seed() { 
    std::random_device entropy; 
    return entropy(); 
} 
+2

Và nếu bạn không sử dụng bộ công cụ C++ 11, có [Boost.Random] (http://www.boost.org/libs/random/), thư viện ngẫu nhiên C++ 11 bị lỏng lẻo dựa trên. Trong mọi trường hợp, _please_, không sử dụng 'rand'. – ildjarn

+0

Được viết độc đáo! :-) –

+0

'rng_type :: result_type' có thể là' engine_type :: result_type' – MSalters

1

C++ có trình tạo số ngẫu nhiên được tích hợp sẵn. Nếu bạn muốn hạt giống nó, sau đó srand((unsigned int)seed) là con đường để đi. Điều này không hoàn toàn giống với mã C# mà bạn đã cho thấy. Khi bạn viết:

Random _rndGenerator = new Random(seed); 

Bạn nhận được một trình tạo số ngẫu nhiên riêng biệt. Vì vậy, bạn có thể có nhiều trình tạo số ngẫu nhiên trong chương trình của mình. Theo hiểu biết của tôi, thư viện C++ không có cấu trúc như vậy, mặc dù nó xuất hiện C++ 11.

Tóm lại, srand((unsigned int)seed) là chính xác nếu bạn đang sử dụng các phiên bản cũ hơn của C++ hoặc nếu bạn chỉ muốn một RNG trong chương trình của mình. Nếu bạn cần nhiều RNG, hãy sử dụng C++ 11 hoặc cuộn của riêng bạn.

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