2013-02-27 35 views
19

Tôi hiểu rằng hàm rand() tạo ra các số giả ngẫu nhiên dựa trên hạt giống được đưa ra và trên nền tảng nhất định, nó sẽ luôn tạo ra cùng một chuỗi các số từ cùng một hạt giống, những gì tôi muốn biết là một chuỗi khác nhau trên các nền tảng sử dụng cùng một thư viện? I E. rand() được triển khai như thế nào?Tại sao hàm C++ stdlib rand() cung cấp các giá trị khác nhau cho cùng một hạt giống trên các nền tảng?

+8

Do đặc tả của 'rand' không quy định giá trị được tạo ra theo trình tự. Sử dụng [] (http: //en.cppreference.com/w/cpp/numeric/random) nếu bạn muốn đảm bảo về các chuỗi. –

+3

Tiêu chuẩn không chỉ định trình tự, hoặc cách trình tự số giả ngẫu nhiên được tạo ra. Vì vậy, không có hạn chế về việc thực hiện hoặc hành vi trên các nền tảng liên quan đến hai khía cạnh này. C++ 11 thêm [máy tạo số ngẫu nhiên với nhiều thông số kỹ thuật hơn] (http://en.cppreference.com/w/cpp/numeric/random). – juanchopanza

+0

Ok, tôi đã kiểm tra tiêu chuẩn và nhận thấy rằng không có gì được chỉ định liên quan đến trình tự, do đó, những yếu tố nào thực hiện phụ thuộc? Là nó còn lại cho hệ điều hành? – Einherji

Trả lời

21

Tiêu chuẩn C++ không chỉ định thuật toán nào được sử dụng cho hàm rand().

Chức năng được xác định bởi bất kỳ ai đã viết thư viện chuẩn trên hệ thống của bạn: Microsoft cho thư viện chuẩn đi kèm với Visual Studio và các thư viện GNU cho thư viện chuẩn được đóng gói với GCC.

Trình biên dịch của bạn đang thực hiện lựa chọn nơi thư viện của nó, vì vậy bạn có thể có các phiên bản khác nhau của thư viện chuẩn cho các trình biên dịch khác nhau trên cùng một hệ thống. Điểm vẫn giữ nguyên: đặc điểm kỹ thuật đảm bảo các chức năng có sẵn và những gì chúng làm; không phải cách họ làm.

+0

Điều đó có nghĩa là chạy trình biên dịch GNU trên Windows sẽ dẫn đến cùng một chuỗi không? –

+0

@OmarKooheji Tôi thực sự chưa từng thử cài đặt GCC trên Windows. Tôi tin rằng GCC, khi được cài đặt, đi kèm với bản sao riêng của thư viện chuẩn (có lẽ đã được biên dịch trước). Tôi không biết điều đó chắc chắn - ai đó có quyền truy cập vào máy tính Windows mà họ có thể cài đặt nội dung trên nên cảm thấy tự do để cập nhật câu trả lời của tôi nếu đúng. – KidneyChris

+1

@OmarKooheji Tôi tò mò, vì vậy tôi đã điều tra. Cập nhật câu trả lời của tôi để chính xác hơn một chút (vì lợi ích của những người cố gắng theo dõi chuỗi nhận xét trong tương lai: ban đầu tôi đã gán thư viện cho hệ điều hành, chứ không phải môi trường dev của bạn) – KidneyChris

7

Đồng rand() chức năng có trách nhiệm tính toán một chuỗi các số nguyên giả ngẫu nhiên trong khoảng [0, {} RAND_MAX] với thời gian ít nhất là 2^32.

Hàm rand_r() sẽ tính một chuỗi giả ngẫu nhiên số nguyên trong khoảng [0, {RAND_MAX}]. (Giá trị của {} RAND_MAX vĩ mô phải có ít nhất 32767.)

Nếu rand_r() được gọi với giá trị ban đầu tương tự cho các đối tượng trỏ đến bởi hạt giống và đối tượng mà không được sửa đổi giữa tiếp lợi nhuận và các cuộc gọi đến rand_r(), cùng một chuỗi sẽ được tạo ra.

Hàm srand() sử dụng đối số làm hạt giống cho một chuỗi mới gồm số giả ngẫu nhiên được trả về bởi các lệnh gọi tiếp theo tới rand(). Nếu srand() sau đó được gọi với cùng một giá trị hạt giống, chuỗi lặp lại số giả ngẫu nhiên. Nếu rand() được gọi trước bất kỳ lệnh gọi hàm srand() nào được thực hiện, cùng một chuỗi sẽ được tạo thành khi srand() được gọi đầu tiên với giá trị hạt giống là 1.

Hàm rand() sẽ trả về số giả ngẫu nhiên tiếp theo trong chuỗi .

Đây là những gì tiêu chuẩn IEEE Std 1003.1 C nói về cách hoạt động của hàm rand(). Nó không nói bất cứ điều gì về cách tính trình tự. Nói cách khác, mỗi người triển khai được tự do lựa chọn phiên bản riêng của một trình tạo chuỗi giả ngẫu nhiên.

Quan sát của bạn cho thấy rằng họ đã tận dụng được sự tự do đó.

tôi có thể cũng chỉ ra rằng rand() là một phần của <cstdlib> mà là nhiều hơn hoặc ít hơn một bản sao của thư viện chuẩn C, và thư viện mới sẽ cung cấp cho bạn linh hoạt hơn và phát chuỗi tiêu chuẩn nếu bạn có một mới đủ trình biên dịch C++ và không phụ thuộc vào khả năng tương tác của C - C++.

+0

'rand' cũng là một phần của C++ thư viện, mặc dù một số phần của tiêu chuẩn được định nghĩa theo tiêu chuẩn C. –

+0

@phresnel, đúng, nó đã xảy ra vì nó không phải là một phần của C++. Tôi đã chỉnh sửa câu trả lời của mình để phản ánh ý tôi. – daramarak

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