2011-08-05 8 views
10

Tôi có một ứng dụng C++ gọi rand() ở nhiều nơi khác nhau. Tôi có cần phải khởi tạo thường xuyên srand() để đảm bảo rằng rand() là ngẫu nhiên hợp lý không, hoặc là đủ để gọi nó một lần khi ứng dụng bắt đầu?Tôi nên gọi srand() thường xuyên như thế nào trong ứng dụng C++?

+2

'srand' không làm cho' rand' "thêm" ngẫu nhiên ". Nó không đảm bảo "ngẫu nhiên hợp lý" trong bất kỳ cách nào. Nó chỉ làm cho chuỗi các số ngẫu nhiên bắt đầu từ điểm quy định. – jalf

Trả lời

15

Nếu bạn chỉ có một sợi đơn, hạt giống sau khi. Nếu bạn thường xuyên reseed, bạn thực sự có thể phá vỡ một số các thuộc tính thống kê của các số ngẫu nhiên. Nếu bạn có nhiều chủ đề, không sử dụng rand ở tất cả, nhưng thay vào đó một cái gì đó threadsafe như drand48_r, cho phép bạn duy trì trạng thái cho mỗi luồng (để bạn có thể gieo một lần cho mỗi luồng).

+1

+1 để đề cập đến chủ đề. – juanchopanza

+1

Boost :: ngẫu nhiên là di động nhiều hơn drand48_r, hoặc sử dụng ngẫu nhiên C++ 0x (đó là một phái sinh Boost) – MSalters

+2

@MSalters: Tất nhiên, tôi sẽ đi cho các tính năng mới '' bất kỳ ngày nào. Họ chỉ tham gia nhiều hơn một chút để thiết lập, vì vậy tôi nghĩ tôi trả lời theo tinh thần của câu hỏi - nhưng thực sự, hãy sử dụng '' nếu bạn có thể! –

3

gọi điện thoại một lần khi ứng dụng bắt đầu

4

Chỉ một lần, khi bắt đầu ứng dụng của bạn.

4

Không chỉ gọi điện một lần là tốt. Sử dụng giá trị hạt giống để tạo chuỗi ngẫu nhiên giống nhau trên mỗi lần thực thi. Điều này có thể hữu ích trong việc thực hiện (ví dụ) một hành vi của trò chơi xác định khi bạn phát lại nó để gỡ lỗi.