Cách tốt nhất để xác định nếu một danh sách các byte là ngẫu nhiên?


8

Có một số thuật toán ngoài đó có thể trả về một số giá trị chỉ ra mức độ ngẫu nhiên? Tôi tin rằng nó được gọi là Entropy dữ liệu .

Gần đây tôi đã đọc bài viết này: http://facemony.rhodes.edu/wetzel/random/mainbody.html

Cách tiếp cận phân tích tiền xu của anh ta có áp dụng cho byte không? Tôi có nên giảm xuống mức bit một lần nữa đúng hay sai không hoặc có cách nào để xác định dựa trên giá trị byte đầy đủ không?

Là phân tích tốt hơn của họ hơn bài viết này?

Câu trả lời:


16

Trong TCS, một cách tiếp cận khác cho vấn đề này là thông qua thử nghiệm phân phối tài sản , trong đó người ta phân biệt xem phân phối có phải là phân phối thống nhất (thực sự) hay "thậm chí không gần" với thống nhất (theo cách chính thức). Ở đây người ta nhận được giới hạn chính xác về số lượng mẫu cần thiết để quyết định câu hỏi.

Xem, ví dụ Phần 6 của hướng dẫn sau: http://people.csail.mit.edu/ronitt/ con / icm.ps

Đặc biệt, người ta có thể quyết định xem một bản phân phối trên là sự thống nhất hay là ε -far (trong tổng số khoảng cách dao động ) từ thống nhất với O ( [n]εtruy vấn / mẫu từ nói phân phối. (Đây cũng là chặt chẽ theo nghĩa làΩ(Ôi(n/ε4)mẫu là cần thiết.)Ω(n)


Điều thú vị là tất cả các phương pháp đều cho rằng phân phối là iid. Đó là, một chuỗi tuần hoàn đơn giản, chẳng hạn như 123123123 với entropy rất thấp, sẽ được coi là đồng nhất với xác suất cao. Bạn có biết nếu có ai đã xem xét thử nghiệm phân phối cho các chuỗi không iid không?
Thomas Ahle

Tôi đã viết điều này để kiểm tra những thứ như chuỗi đơn giản và phát hiện các biến thể tổng từ các phân phối byte ngẫu nhiên thống nhất ... nó hoạt động khá tốt: github.com/earonesty/dotfiles/blob/master/randbytestest.py .
Erik Aronesty

6

Không có thuật toán chính xác duy nhất để đo tính ngẫu nhiên. Các thử nghiệm thống kê khác nhau là một cách tiếp cận có thể, như những người khác đã nói. Một khả năng khác là nén chuỗi byte và xem điều gì sẽ xảy ra. Nếu bạn nhận được khoảng 8 bit / byte (hoặc nhiều hơn), thì chuỗi là ngẫu nhiên đối với mô hình dữ liệu nằm dưới máy nén.

Trong các phương pháp nén tiêu chuẩn, PPM sử dụng mô hình thống kê rõ ràng để dự đoán ký tự tiếp theo dựa trên bối cảnh trước đó. Điểm yếu chính của nó là nó không thể sử dụng sự lặp lại ở quy mô lớn như sự lặp lại giống hệt nhau của một chuỗi ngẫu nhiên dài.

Các phương pháp nén dựa trên phân tích cú pháp LZ77 hoặc Biến đổi Burrows-Wheeler (BWT) hoạt động tốt, khi có nhiều chuỗi con lặp lại trong chuỗi. Tuy nhiên, nhiều triển khai thực tế có kích thước khối / cửa sổ hạn chế để tiết kiệm bộ nhớ, khiến chúng cũng không thể sử dụng tính lặp lại quy mô lớn.

Thay vì nén chuỗi, bạn cũng có thể tính toán một số biện pháp liên quan đến mô hình dữ liệu của máy nén: entropy theo kinh nghiệm bậc cao cho PPM, số lượng chữ cái bằng nhau chạy trong BWT hoặc số cụm từ trong phân tích cú pháp LZ77. Trong hai trường hợp đầu tiên, 8 bit entropy trên mỗi byte hoặc n (1 - 1/256) chạy cho một chuỗi có độ dài n có nghĩa là dữ liệu hoàn toàn ngẫu nhiên.


5

Từ Random.org:

Thật kỳ lạ, về mặt lý thuyết là không thể chứng minh rằng một trình tạo số ngẫu nhiên là thực sự ngẫu nhiên. Thay vào đó, bạn phân tích số lượng ngày càng tăng được tạo bởi một trình tạo nhất định và tùy thuộc vào kết quả, độ tin cậy của bạn đối với trình tạo tăng (hoặc giảm, tùy theo từng trường hợp)

Thêm thông tin có thể được tìm thấy ở đây


4

tốt cho số, không hoàn toàn đúng cho chuỗi byte. có thể điều chỉnh nó mặc dù
Erik Aronesty

@Erik Nó dễ dàng được áp dụng theo nhiều cách. Tất cả những gì bạn cần là một cách sử dụng RNG của bạn để tạo các chuỗi bit - và một chuỗi byte đã là một chuỗi bit.
whuber

đoán tôi đã không thấy làm thế nào để áp dụng nó, giả sử, một mảng gồm 30 mẫu các chuỗi 32 byte. nó trông rất toàn diện ... và dễ sử dụng ( apt install dieharder).
Erik Aronesty

1
@Erik Các tài liệu nói rằng "dieharder thích thử nghiệm các trình tạo đã được gói trong giao diện tương thích GSL để chúng có thể trả về một luồng số ngẫu nhiên không giới hạn." Với mục đích đó, một chuỗi 32 byte có thể được hiểu là một chuỗi gồm 8 quần short không dấu, 4 độ dài không dấu, v.v ... Nó khá linh hoạt, nhưng bạn phải viết một giao diện.
whuber

@ErikAronesty: 30 * 32 byte đơn giản là không đủ dữ liệu và không có thử nghiệm ngẫu nhiên nào có thể khắc phục được thực tế này. Dieharder sẽ (vì lý do chính đáng) cười vào cỡ mẫu của bạn cho đến khi bạn có thứ tự dữ liệu trị giá 1GB hoặc hơn.
Jay Sullivan

3

Độ phức tạp Kolmogorov là một cách để đo tính ngẫu nhiên của các chuỗi và nó không thể tính toán được bằng thuật toán. Sử dụng khái niệm này, không thể đo được tính ngẫu nhiên của tất cả các chuỗi. Sự tồn tại của thuật toán như vậy có thể được sử dụng để giải quyết vấn đề tạm dừng.


3

Như các câu trả lời khác đã đề cập, phiên bản quyết định của vấn đề này (như vấn đề Ngừng và một số vấn đề khác như Vấn đề ốp lát) là không thể giải quyết được. Tuy nhiên, tôi tin rằng bạn đang hỏi về những cách thực tế để đo lường tính ngẫu nhiên của một tập hợp các bit.

Thực hành tiêu chuẩn ở đây là chạy dữ liệu thông qua một loạt các thử nghiệm ngẫu nhiên, như thử nghiệm Chi-Square.


3

Tôip(Tôi1/n,Giáo dục,Tôik/n)

Trong thực tế, không có thử nghiệm phổ biến nào về tính ngẫu nhiên của luồng, thay vào đó là một loạt các thử nghiệm và nếu luồng của bạn thử k trong các thử nghiệm tốt nhất và vượt qua tất cả, chúng ta có thể chắc chắn rằng nó ngẫu nhiên ... cho đến khi ai đó phát minh ra k + 1 ' kiểm tra st mà phá vỡ nó.

Dưới đây là những gì Knuth nói về nó trong "Nghệ thuật thuật toán máy tính, tập 2"

"Nếu một chuỗi hoạt động ngẫu nhiên liên quan đến các thử nghiệm T1, T2, ..., Tn, chúng tôi không thể chắc chắn nói chung rằng đó sẽ không phải là một thất bại thảm hại khi nó phải chịu thử nghiệm tiếp theo T (n + 1). Trong thực tế, chúng tôi áp dụng khoảng nửa tá loại thử nghiệm thống kê khác nhau cho một chuỗi, và nếu nó vượt qua chúng một cách thỏa đáng, chúng tôi coi đó là ngẫu nhiên - sau đó nó được coi là ngẫu nhiên vô tội cho đến khi được chứng minh có tội."

Tôi khuyên bạn nên đọc "Nghệ thuật thuật toán máy tính" của Knuth phần 3.1 để giới thiệu chung về giả danh và 3.3 trong các bài kiểm tra thống kê cho các luồng.


0

Tôi đã thực hiện một bộ thử nghiệm khá yếu nhưng vẫn rất hữu ích cho tôi và cho thấy bản chất của các thử nghiệm ngẫu nhiên nói chung:

  1. tạo một thống kê cho "dữ liệu ngẫu nhiên tốt đã biết" (về mặt toán học hoặc thực nghiệm)
  2. tạo cùng một thống kê cho dữ liệu mẫu của bạn (hy vọng bạn có ít nhất 30 mẫu hoặc hơn)
  3. nhận giá trị ap cho sự khác biệt (giả thuyết: đây là từ các bản phân phối khác nhau)
  4. lặp lại cho thống kê N
  5. bonferonni sửa kết quả (chia cho N)

Nguồn ở đây: https://github.com/earonesty/dotfiles/blob/master/randbytestest.py

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.