Trình tạo số ngẫu nhiên có trạng thái - đó thực sự là một tính năng cần thiết. Số "ngẫu nhiên" tiếp theo là hàm của số trước và hạt/trạng thái. Người thuần túy gọi họ là những người tạo số giả ngẫu nhiên. Các con số sẽ vượt qua các bài kiểm tra thống kê cho sự ngẫu nhiên, nhưng không thực sự - ngẫu nhiên.
Chuỗi các giá trị ngẫu nhiên là hữu hạn và không lặp lại.
Hãy nghĩ đến trình tạo số ngẫu nhiên khi xáo trộn một tập hợp các số và sau đó xử lý chúng theo thứ tự ngẫu nhiên. Hạt giống được sử dụng để "trộn" các số. Khi hạt giống được đặt, chuỗi số được cố định và rất khó dự đoán. Một số hạt sẽ lặp lại sớm hơn những hạt khác.
Hầu hết các máy phát có khoảng thời gian đủ dài để không ai nhận thấy nó lặp lại. Một bộ tạo số ngẫu nhiên 48 bit sẽ tạo ra vài trăm tỷ số ngẫu nhiên trước khi nó lặp lại - với (AFAIK) bất kỳ giá trị hạt 32 bit nào.
Máy phát sẽ chỉ tạo các giá trị giống như ngẫu nhiên khi bạn cho nó một hạt giống duy nhất và để cho nó tăng giá trị. Nếu bạn thay đổi hạt giống, thì số được tạo với giá trị hạt giống mới có thể không xuất hiện ngẫu nhiên khi so sánh với các giá trị được tạo bởi hạt trước đó - tất cả các cược sẽ tắt khi bạn thay đổi hạt giống. Vì vậy, không.
Cách tiếp cận âm thanh là có một máy phát và "xử lý" các con số xung quanh với các khách hàng khác nhau của bạn. Đừng gây rối với việc tạo và loại bỏ máy phát điện. Đừng làm thay đổi hạt giống.
Trên tất cả, không bao giờ cố gắng viết trình tạo số ngẫu nhiên của riêng bạn. Các máy phát tích hợp trong hầu hết các thư viện ngôn ngữ thực sự tốt. Đặc biệt là những cái hiện đại sử dụng hơn 32 bit.
Một số bản phân phối Linux có thiết bị /dev/random
và /dev/urandom
. Bạn có thể đọc chúng một lần để tạo trình tạo số ngẫu nhiên cho ứng dụng của bạn. Chúng có giá trị ngẫu nhiên nhiều hơn hoặc ít hơn, nhưng chúng hoạt động bằng cách "thu thập nhiễu" từ các sự kiện hệ thống ngẫu nhiên. Sử dụng chúng một cách tiết kiệm để có rất nhiều sự kiện ngẫu nhiên giữa các lần sử dụng.
Nguồn
2008-10-15 03:37:39
Bất kỳ bản phân phối Linux nào cũng phải có những thứ đó, và nếu chúng thực sự không, bạn có thể có thể mknod chúng. Nó sẽ có thể xây dựng một hạt nhân mà không có chúng, nhưng tại sao bạn? –
Tôi không đồng ý rằng hầu hết các thư viện ngôn ngữ đều có máy phát điện thực sự tốt. Hầu hết các triển khai của rand() của C chỉ là các máy tạo đồng đẳng tuyến tính với giá trị của một trạng thái của int. Có những triển khai thư viện tốt trên mạng, nhưng tôi sẽ không giả định một gói được biên dịch với trình biên dịch của bạn là chất lượng. Khác hơn thế, câu trả lời hay. –
@Adrian McCarthy: Tôi không chắc tôi muốn nói "nhất" là người nghèo. Hầu như tất cả Linuxen đều có chức năng rand48 48 bit. Kiểm tra trang người đàn ông của bạn để xác nhận rằng bạn có những trang này và sử dụng chúng. Chúng khá ngẫu nhiên và dường như là tiêu chuẩn. –