2010-03-07 49 views
15

Làm cách nào để tạo một số ngẫu nhiên từ 0 đến 1?c - trình tạo số ngẫu nhiên

+5

Thật ngẫu nhiên hoặc giả ngẫu nhiên? – tvanfosson

+2

sự khác biệt là gì? – tm1

+0

@ tm1 - Số giả ngẫu nhiên chỉ xấp xỉ các thuộc tính của các số ngẫu nhiên và không nhất thiết phải phù hợp với các ứng dụng yêu cầu tính ngẫu nhiên thực, như mật mã. Xem http://en.wikipedia.org/wiki/Pseudorandom_number_generator để được giải thích. – tvanfosson

Trả lời

22

Bạn có thể tạo số pseudorandom bằng cách sử dụng stdlib.h. Chỉ cần đính kèm stdlib, sau đó gọi

double random_number = rand()/(double)RAND_MAX; 
+2

Để tham khảo, giá trị này sẽ cho các giá trị trong [0.0, 1.0] tức là bao gồm cả 0.0 và 1.0. –

+3

Và quan trọng nhất, nó rất có thể sẽ không công bằng (!) Có nhiều triển khai trong đó tập hợp [0.0, 1.0] chứa nhiều hơn các phần tử RAND_MAX. (_In C, tập hợp [0.0, 1.0] là một tập hợp hữu hạn đếm được) – MSalters

+0

@MSalters, đó là một vấn đề thú vị, bất kỳ suy nghĩ nào về giải pháp? –

9

Giả sử OP muốn hoặc là 0 hoặc 1:

srand(time(NULL)); 
foo = rand() & 1; 

Sửa lấy cảm hứng từ bình luận: Cũ rand() triển khai đã có một lỗ hổng - bậc thấp bit có thời gian ngắn hơn nhiều so bit thứ tự cao hơn để sử dụng bit có thứ tự thấp cho việc triển khai như vậy không tốt. Nếu bạn biết thực hiện rand() của bạn bị từ lỗ hổng này, sử dụng bit bậc cao, như thế này:

foo = rand() >> (sizeof(int)*8-1) 

giả thường xuyên 8-bit-per-byte kiến ​​trúc

+0

Điều này hoạt động hoàn hảo, cảm ơn. – tm1

+1

bạn nên thay đổi kết quả của 'rand()' để giải thích các vấn đề với máy tạo đồng tuyến tuyến tính – Christoph

+0

@Christoph Cảm ơn bạn, tôi đã chỉnh sửa bài đăng của tôi để phản ánh quan điểm của bạn. – qrdl

8

man 3 drand48chính xác những gì bạn yêu cầu cho.

Các drand48()erand48() chức năng quay trở lại không âm, kích đúp chính xác, giá trị dấu chấm động, phân bố đều trên khoảng [0.0, 1.0].

Chúng được tìm thấy trong #include <stdlib.h> trên nền tảng UNIX. Tuy nhiên, chúng không có trong ANSI C, vì vậy (ví dụ) bạn sẽ không tìm thấy chúng trên Windows trừ khi bạn mang theo việc triển khai của riêng bạn (ví dụ: LibGW32C).

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