2013-01-21 26 views
15

Đối với mã sử dụng std::random_shuffle, tôi cần thiết lập một hạt giống ngẫu nhiên sao cho chuỗi giả ngẫu nhiên được tạo ra khác nhau trong mỗi lần chạy chương trình.Có phải C++ hiện đại dùng srand để đặt hạt giống ngẫu nhiên không?

Các code example here làm cho một cuộc gọi đến

srand (unsigned (time (NULL))); 

mà cần phải

#include <ctime> 
#include <cstdlib> 

Tôi tự hỏi: Vì C++ 11 bao gồm bản cập nhật lớn này sang thế hệ số giả ngẫu nhiên, điều này vẫn còn đến nay? Tôi nên sử dụng cái gì để đặt hạt giống ngẫu nhiên cho std::random_shuffle?

+0

Cũng thấy [Tại sao std :: shuffle phương pháp không được chấp nhận trong C++ 14?] (Http://stackoverflow.com/q/22600100/1708801) –

Trả lời

25

random_shuffle sử dụng trình tạo số ngẫu nhiên được xác định do thực hiện trừ khi bạn cung cấp. Vì vậy, không, sử dụng srand không nhất thiết phải chính xác.

Nếu không, thiết bị sẽ sử dụng trình tạo mà bạn cung cấp. Bạn có thể sử dụng rand nếu bạn muốn chắc chắn đó là những gì được sử dụng.

srand(seed); 
std::random_shuffle(first, last, [](int n) { return rand() % n; }); 
// this is a biased generator 
// see <http://eternallyconfuzzled.com/arts/jsw_art_rand.aspx> 

Tuy nhiên, tôi khuyên bạn nên sử dụng cơ sở mới <random> thay vì rand(). Ví dụ sau.

std::default_random_engine gen(seed); 

std::shuffle(first, last, gen); 
+0

Bạn có thể cung cấp ví dụ về mã không? Tôi gặp khó khăn khi hiểu phải làm gì chính xác. – clstaudt

+0

@cls Tôi đã đưa ra một ví dụ. –

+0

Cảm ơn. Tôi nên đặt 'lo' và' hi' thành gì? – clstaudt

3

Nếu bạn đang sử dụng C++ 11, suy nghĩ về việc sử dụng std::shuffle thay vì std::random_shuffle, và đi qua một máy phát điện ngẫu nhiên số, như trong ví dụ cuối cùng here

+2

Phiên bản 'random_shuffle' có' RandomFunc && r' khác với 'shuffle' như thế nào? – David

+2

@Dave yêu cầu một hàm khi được gọi là 'r (n)' để trả về một số ngẫu nhiên trong khoảng [0, n]. –

0

Nếu bạn thực sự quan tâm về tính chính xác, chất lượng và sự đa dạng của các cách tạo số ngẫu nhiên, tôi rất muốn xem xét sử dụng số Gnu Scientific Library nổi tiếng (GSL)

Điều này cho phép tạo ra các thuật toán đồng nhất và khác nhau thực sự tốt nhất. Xem here.

Đặc biệt thisthis mô tả các thuật toán có sẵn:

— gsl_rng_mt19937 
— gsl_rng_taus 
— gsl_rng_taus2 
— gsl_rng_gfsr4 
... 

EDIT: Cũng boost::random phải là một lựa chọn tốt xem xét GPLness của GSL (nhưng tôi không bao giờ dealed với nó ...).

+2

Đó là GPLed, đó có thể là một vấn đề. – user1095108

+0

Đúng vậy, tôi đã không trả lời về điều đó, vì tôi cũng bị GPL như vậy ;-) –

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