2011-01-31 40 views
5

Tôi đang tìm cách tạo các giá trị số nguyên ngẫu nhiên lớn, không âm trên hệ thống POSIX. Tôi đã tìm thấy 2 chức năng có thể là phù hợp với những hóa đơn, và initializers tương ứng của họ:Số ngẫu nhiên trong POSIX C API

 #include <stdlib.h> 

     long int random(void);  
     void srandom(unsigned int seed); 
CONFORMING TO 
     4.3BSD, POSIX.1-2001. 

     // and 

     long int lrand48(void); 
     void srand48(long int seedval);  
CONFORMING TO 
     SVr4, POSIX.1-2001. 
  1. Những chức năng được ưa thích (thread-an toàn và phạm vi của các giá trị được tạo ra)?
  2. Vì bảo mật đó không phải là mối quan ngại, tôi nên gieo hạt giống như thế nào?
  3. Phương pháp gieo hạt có khác nhau do các đối số khác nhau cho các hàm giống (long int so với unsigned int)?
+0

nếu bạn đang sử dụng hệ thống POSIX cũng sử dụng '/ dev/urandom' hoặc'/dev/random' –

Trả lời

3

Sử dụng nrand48, nó có cùng phạm vi với lrand48 và nhận con trỏ tới một mảng được sử dụng làm hạt giống. làm cho thread này cục bộ sẽ đảm bảo an toàn luồng. (như một lưu ý phụ, có vẻ như việc triển khai glibc có thể có một số vấn đề, xem http://evanjones.ca/random-thread-safe.html để biết thêm thông tin, trang này cũng chứa một bản tóm tắt về các chức năng tạo số ngẫu nhiên an toàn chủ đề)

+0

+1 để trỏ đến [nrand48] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/erand48.html) và ghi chú bên trên các vấn đề tiềm năng của nó – jschmier

+0

Bạn có thể giải thích tại sao 'nrand48' tốt hơn' ngẫu nhiên' không? –

+2

AFAICT, 'random' không phải là chủ đề an toàn (Việc triển khai glibc là vì nó khóa trạng thái nội bộ của nó, nhưng điều này có thể không đúng với tất cả các triển khai POSIX). glibc cung cấp 'random_r' là luồng an toàn nhưng không di động. điều duy nhất 'nrand48' làm tốt hơn là an toàn luồng, cho phép bạn nhận được các luồng số ngẫu nhiên độc lập. các phạm vi tương tự ('random' là' 2^31 - 1', 'nrand48' là' 2^31'), khoảng thời gian cho 'ngẫu nhiên' có thể dài hơn. Dòng dưới cùng, IMHO, đang sử dụng 'nrand48' nếu bạn cần an toàn luồng,' random' nếu không. – Hasturkun