Chức năng rand()
là đặc biệt cần thiết để sản xuất cùng một chuỗi các con số khi hạt giống với một hạt giống cho trước (bằng cách gọi srand()
) ; mỗi giá trị hạt giống có thể chỉ định một chuỗi. Và nếu bạn không bao giờ gọi srand()
, bạn sẽ nhận được cùng một chuỗi bạn có thể nhận được bằng cách gọi srand(1)
trước khi có bất kỳ cuộc gọi nào đến rand()
.
(Điều này không áp dụng trên các triển khai C hoặc C++ khác nhau.)
Điều này có thể hữu ích cho mục đích thử nghiệm. Ví dụ: nếu có lỗi trong chương trình của bạn, bạn có thể tạo lại bằng cách chạy lại nó với cùng một hạt giống, đảm bảo rằng (chặn các hành vi không thể đoán trước khác), bạn sẽ nhận được cùng một chuỗi số giả ngẫu nhiên.
Gọi srand(time(NULL))
là cách được khuyến nghị thông thường để nhận được nhiều số giả ngẫu nhiên không thể đoán trước. Nhưng nó không hoàn hảo. Nếu chương trình của bạn chạy hai lần trong cùng một giây, có thể bạn sẽ nhận được cùng một chuỗi, bởi vì time()
(thường) có độ phân giải 1 giây. Và các triển khai “rand()” điển hình là không phải là đủ tốt để sử dụng mật mã; nó quá dễ dàng cho kẻ tấn công để đoán những con số bạn sẽ nhận được.
Có một số triển khai số ngẫu nhiên khác. Các hệ thống Linux có hai thiết bị giả, /dev/random
và /dev/urandom
, từ đó bạn có thể đọc các giá trị byte giả ngẫu nhiên chất lượng cao hợp lý.Một số hệ thống có thể có các chức năng như random()
, drand48()
, v.v. Và có rất nhiều thuật toán; Tôi đã nghe những điều tốt đẹp về Mersenne Twister.
Đối với nội dung nào đó như trò chơi, nơi bạn không mong đợi hoặc quan tâm đến người chơi đang cố gắng gian lận, srand(time(NULL))
và rand()
có lẽ là đủ tốt. Vì mục đích nghiêm túc hơn, bạn nên nhận lời khuyên từ một người biết nhiều hơn về công cụ này hơn tôi.
Mục 13 của comp.lang.c FAQ có một số thông tin rất tốt về việc tạo số ngẫu nhiên giả.
Nguồn
2011-10-13 01:13:13
Xem http://en.wikipedia.org/wiki/Pseudorandom_number_generator – DuckMaestro