2012-10-13 30 views
5

Vì vậy, tôi có nhiều chuỗi sẽ sử dụng hàm rand_r. Chữ ký của chức năng này là:Cách gieo hạt thích hợp phương pháp rand_r (int * val)

int rand_r(int *val); 

Tôi đã cố gắng sử dụng thời gian để hạt giống chức năng này nhưng tôi đang gặp tất cả các loại sự cố. Bất cứ ai có thể giải thích cho tôi như thế nào tôi sẽ gọi rand_r bằng cách sử dụng thời gian, hoặc một số cách đơn giản khác để hạt giống rand_r động.

Cảm ơn!

+0

vui lòng tham khảo hướng dẫn-> http://linux.die.net/man/3/rand_r – MByD

+0

Tất cả các loại sự cố là gì? Hãy cụ thể để chúng tôi có thể trợ giúp. –

+0

Hi @Thomas Tôi đã cố gắng sử dụng tất cả các hình thức này. Và tôi đang gặp rất nhiều rắc rối với con trỏ tôi đoán. Tôi đã cố gắng làm: rand_r ((unsigned int *) thời gian (null)) và tôi đã không nhận được một vấn đề biên dịch, nhưng có lỗi phân đoạn khi chạy. – user1742385

Trả lời

9

Đối với phiên bản reentrant rand_r, hạt giống chỉ là giá trị ban đầu của tiểu bang. Bạn cần một hạt giống cho mỗi chuỗi. Hoặc tạo ra một loạt các hạt giống, hoặc làm cho các hạt giống biến thread-địa phương:

_Thread_local unsigned int seed = time(NULL); 

int do_stuff() 
{ 
    for (; ;) 
    { 
     int n = rand_r(&seed); 
     // use n 
    } 
} 
+1

+1 để sử dụng tính năng C11 hoàn toàn mới và sáng bóng '_Thread_local'. Có lẽ nên thêm rằng không phải tất cả các trình biên dịch hỗ trợ trực tiếp, nhưng có thể có phần mở rộng tương tự, hỗ trợ luồng trong C11 là tùy chọn và việc sử dụng được chỉ định là bao gồm "threads.h" và sử dụng macro đẹp hơn 'thread_local ', thay vào đó. –

0

Trên hệ thống UNIX/POSIX bạn có thể mở /dev/urandom cho số ngẫu nhiên ban đầu, đọc đủ byte để có được một hạt giống cho mỗi thread. Microsoft Windows có một cách phức tạp hơn để có được những con số như vậy. Tra cứu CryptGenRandom để biết chi tiết. Vì chúng dựa trên entropy hệ thống, chúng không dành cho các số ngẫu nhiên có khối lượng lớn.

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