2008-11-30 18 views
10

Có rất nhiều thông tin xung đột về chủ đề này. Vì vậy, hãy cố gắng đồng ý với một câu trả lời dứt khoát:C: sự thật dứt khoát về rand, ngẫu nhiên và arc4random

Máy phát số ngẫu nhiên nào trong C tạo ra sự ngẫu nhiên tốt hơn: rand, random hoặc arc4random?

lưu ý: Chỉ cần để làm cho câu hỏi rõ ràng, đây không phải là một câu hỏi về tính ngẫu nhiên đúng, nó chỉ là một cuộc đụng độ giữa những người 3.


Như đã chỉ ra, câu hỏi này không có ý nghĩa nhiều, vì đây không phải là về C, nhưng về một thực hiện cụ thể, trong trường hợp của tôi, ca cao (cụ thể hơn là sdk iphone, nhưng tôi đoán là họ là giống như xa như các chức năng này đi). Tuy nhiên, có một số thông tin hữu ích ở đây. Tôi kết luận bằng cách thực hiện arc4random, chủ yếu là do dễ sử dụng của nó (không cần gieo hạt), mà là một yếu tố quan trọng mà không ai chỉ ra.

Tôi đang đóng câu hỏi và thêm thẻ ca cao cho nhà phát triển ca cao tìm kiếm thông tin về RNG. Rất cám ơn những người đã đóng góp và xin lỗi vì sự nhầm lẫn này.

+0

Còn nhóm PRNG drand48() thì sao? Đánh giá của tôi sẽ là 'không phải trong tiêu chuẩn C', một phần của POSIX/SUS; thường tốt hơn so với rand; có lẽ không tốt bằng ngẫu nhiên() và các chức năng hỗ trợ của nó. –

+0

Câu hỏi không có ý nghĩa. Chỉ rand() là một phần của ngôn ngữ C, và tiêu chuẩn nói không có gì về cách ngẫu nhiên nó nên được hoặc làm thế nào nó nên được thực hiện. – jalf

+0

Vâng, rõ ràng tôi đã sai lầm. Nó đáng lẽ phải bị trầy xước thành ca cao. Giờ thì sao? Thay đổi phạm vi của câu hỏi sẽ làm cho câu trả lời khó xử.Nhưng có những thông tin hữu ích ở đây cho các nhà phát triển ca cao, và việc đóng câu hỏi sẽ khiến tất cả mọi người trở nên yếu đuối. Phải làm gì? –

Trả lời

23

Trong số các chức năng này, chỉ rand là một phần của tiêu chuẩn C. ngẫu nhiên là một phần của POSIX và arc4random chỉ được cung cấp trong BSD (và có nguồn gốc). Vì vậy, chỉ rand là "trong C".

Đối với rand, tiêu chuẩn C không nói gì về chất lượng của máy phát, tức là luôn trả về cùng một số sẽ phù hợp. Nó nói rằng số phải nằm trong khoảng từ 0 đến RAND_MAX. Giá trị của RAND_MAX, và thuật toán chính xác được sử dụng, được thực hiện xác định (mặc dù RAND_MAX phải có ít nhất 32767).

Ví dụ, POSIX specifies phải có khoảng thời gian ít nhất là 2^31, và nếu initstate được gọi với 256 byte trạng thái, thì phải có khoảng thời gian ít nhất 2^69; các chi tiết khác lại được xác định thực hiện.

Đối với arc4random, việc triển khai cụ thể là một phần của định nghĩa của nó (RC4). Nó chỉ định rằng nó cho 2^32 giá trị khác nhau; Tôi không thể tìm thấy bất cứ điều gì về thời gian của nó.

Để so sánh chúng chi tiết, người ta phải biết bạn thực hiện cụ thể việc triển khai cụ thể nào.

+0

hi martin, trong trường hợp của tôi việc thực hiện là SDK iPhone. Nó thực sự quan trọng đối với câu hỏi này? Tôi có nên chỉnh sửa không? Tôi sẽ tốt hơn nếu tôi có thể tránh thay đổi phạm vi của câu hỏi. –

+0

Nếu iphone SDK tương tự như OSX, thì việc thực hiện rand() là từ FreeBSD (rand.c 1.15). Thuật toán sau đó là từ Parker và Miller, "Máy tạo số ngẫu nhiên: những cái tốt khó tìm". ngẫu nhiên sau đó sử dụng cùng một thuật toán nếu n của initstate <8; rand đã là một thuật toán tốt –

+0

Thuật toán arc4random có ​​giống nhau trong mọi triển khai không? Tôi đọc ở đây là tốt nhất trong ca cao: http://iphonedevelopment.blogspot.com/2008/10/random-thoughts-rand-vs-arc4random.html. Làm thế nào để nó so sánh nói chung với 2 khác, trong hầu hết các triển khai? Có lẽ chúng ta có thể đạt được một số đồng thuận. –

9

Việc triển khai rand() không được chỉ định theo tiêu chuẩn C, tuy nhiên hầu hết các trình biên dịch đều sử dụng trình tạo đồng tuyến tuyến tính. random() và arc4random() không phải là chuẩn C, nhưng chúng tốt hơn so với việc thực hiện thông thường của rand()

Tôi muốn nói: arc4random() tốt hơn so với random() tốt hơn là rand()

rand() thực sự khủng khiếp. Bạn có thể dễ dàng làm tốt hơn cả ba.

Nó cũng phụ thuộc vào những gì bạn muốn các số ngẫu nhiên. Trình tạo số ngẫu nhiên tốt để mã hóa/bảo mật có thể không phải là trình tạo số ngẫu nhiên tốt cho mô phỏng và ngược lại.

+0

"Tôi muốn nói ...". Bạn có thể quan tâm để giải thích tại sao? – Spookbuster

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