Những phương pháp nào được sử dụng để thử nghiệm các thuật toán tạo phương sai ngẫu nhiên?
Những phương pháp nào được sử dụng để thử nghiệm các thuật toán tạo phương sai ngẫu nhiên?
Câu trả lời:
Các Diehard thử nghiệm Suite là một cái gì đó gần gũi với một tiêu chuẩn vàng để thử nghiệm máy phát điện số ngẫu nhiên. Nó bao gồm một số thử nghiệm trong đó một trình tạo số ngẫu nhiên tốt sẽ tạo ra kết quả được phân phối theo một số phân phối đã biết so với kết quả sử dụng trình tạo được kiểm tra có thể được so sánh.
BIÊN TẬP
Tôi phải cập nhật điều này vì tôi không chính xác: Diehard vẫn có thể được sử dụng rất nhiều, nhưng nó không còn được duy trì và không còn là hiện đại nữa. NIST đã đưa ra một loạt các bài kiểm tra cải tiến kể từ đó.
Chỉ cần thêm một chút vào câu trả lời của tiếng còi, Bộ thử nghiệm Diehard (được phát triển bởi George Marsaglia) là các bài kiểm tra tiêu chuẩn cho PRNG.
Có một thư viện Diehard C đẹp cho phép bạn truy cập vào các bài kiểm tra này. Cũng như các thử nghiệm Diehard tiêu chuẩn, nó cũng cung cấp các chức năng cho một vài thử nghiệm PRNG khác liên quan đến (trong số những thứ khác) kiểm tra thứ tự bit. Ngoài ra còn có một điều kiện thuận lợi để kiểm tra tốc độ của RNG và viết các bài kiểm tra của riêng bạn.
Có một giao diện R cho thư viện Dieharder, được gọi là RDieHarder :
library(RDieHarder)
dhtest = dieharder(rng="randu", test=10, psamples=100, seed=12345)
print(dhtest)
Diehard Count the 1s Test (byte)
data: Created by RNG `randu' with seed=12345,
sample of size 100 p-value < 2.2e-16
Điều này cho thấy rằng trình tạo RANDU RNG không thực hiện kiểm tra khoảng cách tối thiểu / 2dsphere.
Để kiểm tra các số được tạo bởi các bộ tạo số ngẫu nhiên, các thử nghiệm Diehard là một cách tiếp cận thực tế. Nhưng những thử nghiệm đó có vẻ như tùy tiện và người ta có thể không biết nên đưa thêm vào hay nếu có cách nào để thực sự kiểm tra tính ngẫu nhiên.
Ứng cử viên tốt nhất cho định nghĩa về trình tự ngẫu nhiên dường như là tính ngẫu nhiên của Martin-Löf . Ý tưởng chính cho loại ngẫu nhiên này, được phát triển đẹp mắt trong Knuth, phần 3.5 , là để kiểm tra tính đồng nhất cho tất cả các loại chuỗi con của chuỗi số ngẫu nhiên. Nhận được rằng tất cả các loại định nghĩa về quyền sau đó hóa ra rất khó ngay cả khi người ta sử dụng các khái niệm về khả năng tính toán.
Các thử nghiệm Diehard chỉ là một số trong những điều có thể xảy ra mà người ta có thể xem xét và thất bại của họ sẽ loại trừ tính ngẫu nhiên của Martin-Löf.
Bạn không thể chứng minh, bởi vì điều đó là không thể; bạn chỉ có thể kiểm tra nếu không có bất kỳ sự tự kỷ hoặc rối loạn phân phối đáng xấu hổ nào, và thực sự Diehard là một tiêu chuẩn cho nó. Điều này là để thống kê / vật lý, các nhà mật mã cũng sẽ chủ yếu kiểm tra (trong số những thứ khác) mức độ khó để phù hợp với trình tạo dữ liệu để có được các giá trị trong tương lai.
Sửa lỗi nhỏ cho bài viết của Colin: gói CRAN CRAN RDieHarder là giao diện của DieHarder , phần viết lại / mở rộng / đại tu Diehard được thực hiện bởi Robert G. Brown (người vui lòng liệt kê tôi là đồng tác giả dựa trên trình bao bọc RDieHarder của tôi) với sự đóng góp gần đây của David Bauer.
Trong số những thứ khác, DieHarder bao gồm pin thử nghiệm NIST được đề cập trong bài đăng của Mark cũng như một số thử nghiệm mới. Đây là nghiên cứu đang diễn ra và đã được một thời gian. Tôi đã nói chuyện tại useR! 2007 về RDieHarder mà bạn có thể nhận được từ đây .
Rất hiếm khi kết luận rằng một cái gì đó là "ngẫu nhiên" trong bản tóm tắt. Thường xuyên hơn bạn muốn kiểm tra xem nó có một loại cấu trúc ngẫu nhiên nhất định. Ví dụ: bạn có thể muốn kiểm tra xem một cái gì đó có phân phối đồng đều hay không, với tất cả các giá trị trong một phạm vi nhất định có khả năng như nhau. Hoặc bạn có thể muốn kiểm tra xem một cái gì đó có phân phối bình thường hay không, v.v. Để kiểm tra xem dữ liệu có phân phối cụ thể hay không, bạn có thể sử dụng mức độ phù hợp của kiểm tra sự phù hợp như kiểm tra chi bình phương hoặc kiểm tra Kolmogorov-Smirnov.
Có hai phần để kiểm tra một trình tạo số ngẫu nhiên. Nếu bạn chỉ quan tâm đến việc thử nghiệm một trình tạo thống nhất, thì có, một cái gì đó như bộ thử nghiệm DIEHARD là một ý tưởng tốt.
Nhưng thường thì bạn cần kiểm tra sự biến đổi của một máy phát đồng nhất. Ví dụ: bạn có thể sử dụng một trình tạo thống nhất để tạo các giá trị phân tán theo cấp số nhân hoặc thông thường. Bạn có thể có một trình tạo thống nhất chất lượng cao - giả sử bạn có một triển khai đáng tin cậy của một thuật toán nổi tiếng như Mersenne Twister - nhưng bạn cần kiểm tra xem đầu ra được chuyển đổi có phân phối đúng hay không. Trong trường hợp đó, bạn cần thực hiện một số loại tốt của kiểm tra sự phù hợp như Kolmogorov-Smirnov. Nhưng đối với người mới bắt đầu, bạn có thể xác minh rằng giá trị trung bình và phương sai mẫu có các giá trị bạn mong đợi.
Hầu hết mọi người không - và không nên - viết trình tạo số ngẫu nhiên thống nhất của riêng họ từ đầu. Thật khó để viết một trình tạo tốt và dễ đánh lừa bản thân bạn khi nghĩ rằng bạn đã viết một trình tạo tốt khi bạn chưa làm. Ví dụ, Donald Knuth kể câu chuyện trong TAOCP tập 2 của một trình tạo số ngẫu nhiên mà anh ta viết mà hóa ra là khủng khiếp. Nhưng mọi người thường phải viết mã của riêng mình để tạo ra các giá trị ngẫu nhiên từ một bản phân phối mới.
Các NIST công bố một danh sách kiểm tra thống kê với một thực hiện tham chiếu trong C.
Ngoài ra còn có TestU01 bởi một số người thông minh, bao gồm cả nhà nghiên cứu PRNG đáng kính Pierre Pierrecuyer. Một lần nữa, có một triển khai tham chiếu trong C.
Như được chỉ ra bởi các nhà bình luận khác, đây là để thử nghiệm việc tạo ra các bit ngẫu nhiên giả. Nếu bạn chuyển đổi các bit này thành một biến ngẫu nhiên khác nhau (ví dụ: biến đổi Box-Muller từ đồng nhất sang Bình thường), bạn sẽ cần các thử nghiệm bổ sung để xác nhận tính chính xác của thuật toán biến đổi.