Tôi sẽ cho điều này một lần, vì tôi đủ băn khoăn trước lời khuyên được đưa ra trong một số câu trả lời khác.
Đặt là các chuỗi bit vô hạn được tạo bởi hai RNG (không nhất thiết là các PRNG có tính xác định khi biết trạng thái ban đầu) và chúng tôi đang xem xét khả năng sử dụng chuỗi với hy vọng cải thiện hành vi theo một nghĩa nào đó. Có rất nhiều cách khác nhau trong đó có thể được coi là tốt hơn hoặc xấu hơn so với mỗi và ; Dưới đây là một số ít mà tôi tin là có ý nghĩa, hữu ích và phù hợp với cách sử dụng thông thường của các từ "tốt hơn" và "tệ hơn":X⃗ ,Y⃗ X⃗ ⊕Y⃗ X⃗ ⊕Y⃗ X⃗ Y⃗
- (0) Xác suất ngẫu nhiên thực sự của chuỗi tăng hoặc giảm
- (1) Xác suất không ngẫu nhiên có thể quan sát tăng hoặc giảm (đối với một số người quan sát áp dụng một số lượng xem xét nhất định, có lẽ)
- (2) Mức độ nghiêm trọng / rõ ràng của sự không ngẫu nhiên có thể quan sát tăng hoặc giảm.
Trước tiên, hãy nghĩ về (0), đây là người duy nhất trong số ba người có hy vọng được làm chính xác. Lưu ý rằng, trên thực tế, một trong hai RNG đầu vào thực sự là ngẫu nhiên, không thiên vị và độc lập với nhau, thì kết quả XOR cũng sẽ thực sự ngẫu nhiên và không thiên vị. Với ý nghĩ đó, hãy xem xét trường hợp khi bạn tin rằng là các luồng bit bị cô lập không thiên vị thực sự ngẫu nhiên, nhưng bạn không hoàn toàn chắc chắn. Nếu là các xác suất tương ứng mà bạn đã sai về từng người trong số họ, thì xác suất không thực sự ngẫu nhiên là
, trên thực tế ít hơn nhiều kể từ khiX⃗ ,Y⃗ εX,εYX⃗ ⊕Y⃗ ≤εXεY<min{εX,εY}εX,εY được giả định rất gần với 0 ("bạn tin rằng chúng là thực sự ngẫu nhiên"). Và trên thực tế, nó thậm chí còn tốt hơn thế, khi chúng ta cũng tính đến khả năng thực sự độc lập ngay cả khi không thực sự ngẫu nhiên:
Do đó, chúng tôi có thể kết luận rằng theo nghĩa (0), XOR không thể làm tổn thương và có khả năng giúp ích rất nhiều.X⃗ ,Y⃗
Pr(X⃗ ⊕Y⃗ not truly random)≤min{Pr(X⃗ not truly random),Pr(Y⃗ not truly random),Pr(X⃗ ,Y⃗ dependent)}.
Tuy nhiên, (0) không thú vị đối với PRNG, vì trong trường hợp PRNG, không có trình tự nào trong câu hỏi có bất kỳ cơ hội nào thực sự ngẫu nhiên.
Do đó, đối với câu hỏi này, thực tế là về PRNG, chúng ta phải nói về một cái gì đó như (1) hoặc (2). Vì chúng thuộc về các tính chất và số lượng như "có thể quan sát được", "nghiêm trọng", "rõ ràng", "rõ ràng", giờ chúng ta đang nói về sự phức tạp của Kolmogorov, và tôi sẽ không cố gắng làm cho chính xác. Nhưng tôi sẽ đi xa hơn để đưa ra lời khẳng định không gây tranh cãi rằng, bằng một biện pháp như vậy, "01100110 ..." (period = 4) còn tệ hơn "01010101 ..." (period = 2) tệ hơn " 00000000 ... "(không đổi).
Bây giờ, người ta có thể đoán rằng (1) và (2) sẽ theo cùng một xu hướng như (0), và do đó kết luận "XOR không thể bị tổn thương" vẫn có thể giữ vững. Tuy nhiên, lưu ý khả năng quan trọng là cả và đều không ngẫu nhiên, nhưng mối tương quan giữa chúng khiến có thể quan sát được là không ngẫu nhiên. Tất nhiên, trường hợp nghiêm trọng nhất là khi (hoặc ), trong trường hợp này là hằng số, kết quả tồi tệ nhất trong tất cả các kết quả có thể xảy ra; nói chung, thật dễ dàng để thấy rằng, bất kể và tốt như thế nào ,X⃗ Y⃗ X⃗ ⊕Y⃗ X⃗ =Y⃗ X⃗ =not(Y⃗ )X⃗ ⊕Y⃗ X⃗ Y⃗ X⃗ và cần phải "gần gũi" với độc lập để xor của họ không thể quan sát được - không hợp lý. Trong thực tế, việc không phụ thuộc một cách hợp lý có thể được định nghĩa một cách hợp lý là là không quan sát được - không hợp lý.Y⃗ X⃗ ⊕Y⃗
Sự phụ thuộc bất ngờ như vậy hóa ra là một vấn đề thực sự lớn.
Một ví dụ về những gì sai
Câu hỏi nêu rõ "Tôi đang loại trừ ví dụ phổ biến của một số thanh ghi dịch chuyển phản hồi tuyến tính làm việc cùng nhau vì chúng cùng họ". Nhưng tôi sẽ loại trừ sự loại trừ đó vào lúc này, để đưa ra một ví dụ thực tế rõ ràng rất đơn giản về loại điều có thể sai với XORing.
Ví dụ của tôi sẽ là một triển khai cũ của rand () trên một số phiên bản của Unix vào khoảng năm 1983. IIRC, việc triển khai hàm rand () này có các thuộc tính sau:
- giá trị của mỗi lệnh gọi rand () là 15 bit giả ngẫu nhiên, nghĩa là một số nguyên trong phạm vi [0, 32767).
- các giá trị trả về liên tiếp xen kẽ - lẻ - chẵn - lẻ; nghĩa là, bit có ý nghĩa nhất xen kẽ 0-1-0-1 ...
- bit tiếp theo ít quan trọng nhất có chu kỳ 4, bit tiếp theo sau đó có chu kỳ 8, ... vì vậy bit thứ tự cao nhất có chu kỳ .215
- do đó, chuỗi các giá trị trả về 15 bit của rand () là định kỳ với chu kỳ .215
Tôi đã không thể xác định được mã nguồn ban đầu, nhưng tôi đoán từ việc ghép một vài bài đăng từ trong https://groups.google.com/forum/#!topic/comp.os.vms/9k4W6KrRV3A rằng nó đã làm chính xác như sau (mã C), đồng ý với bộ nhớ của tôi về các thuộc tính ở trên:
#define RAND_MAX 32767
static unsigned int next = 1;
int rand(void)
{
next = next * 1103515245 + 12345;
return (next & RAND_MAX);
}
void srand(seed)
unsigned int seed;
{
next = seed;
}
Như người ta có thể tưởng tượng, cố gắng sử dụng rand () này theo nhiều cách khác nhau đã dẫn đến một loại thất vọng.
Ví dụ, tại một thời điểm, tôi đã thử mô phỏng một chuỗi các đồng xu ngẫu nhiên lật bằng cách liên tục lấy:
rand() & 1
tức là bit ít quan trọng nhất Kết quả là những cái đầu-đuôi-đầu-đuôi-đuôi đơn giản. Điều đó thật khó tin lúc đầu (phải là một lỗi trong chương trình của tôi!), Nhưng sau khi tôi tự thuyết phục bản thân mình đó là sự thật, tôi đã thử sử dụng bit ít quan trọng nhất tiếp theo để thay thế. Điều đó không tốt hơn nhiều, như đã lưu ý trước đó - bit đó là định kỳ với giai đoạn 4. Tiếp tục khám phá các bit cao hơn liên tiếp đã tiết lộ mô hình mà tôi đã lưu ý trước đó: nghĩa là, mỗi bit bậc cao tiếp theo có gấp đôi khoảng thời gian trước đó, vì vậy trong sự tôn trọng bit thứ tự cao nhất này là hữu ích nhất trong số chúng. Tuy nhiên, xin lưu ý rằng không có ngưỡng đen trắng "bit là hữu ích, bit không hữu ích" ở đây; tất cả những gì chúng ta thực sự có thể nói là các vị trí bit được đánh số có mức độ hữu dụng / vô dụng khác nhau.ii−1
Tôi cũng đã thử những thứ như xáo trộn kết quả hơn nữa hoặc XOR các giá trị cùng nhau được trả về từ nhiều lệnh gọi đến rand (). XORing các cặp giá trị rand () liên tiếp là một thảm họa, tất nhiên - nó dẫn đến tất cả các số lẻ! Đối với mục đích của tôi (cụ thể là tạo ra một chuỗi các đồng xu "rõ ràng ngẫu nhiên"), kết quả tương đương không đổi của XOR thậm chí còn tồi tệ hơn so với hành vi chẵn lẻ xen kẽ của bản gốc.
Một biến thể nhỏ đặt điều này vào khung ban đầu: đó là, hãy để là chuỗi các giá trị 15 bit được trả về bởi rand () với một hạt giống đã cho và chuỗi từ một hạt giống khác . Một lần nữa, sẽ là một chuỗi gồm các số chẵn hoặc toàn số lẻ, tệ hơn so với hành vi chẵn / lẻ xen kẽ ban đầu.X⃗ sXY⃗ sYX⃗ ⊕Y⃗
Nói cách khác, đây là một ví dụ trong đó XOR làm mọi thứ tồi tệ hơn theo nghĩa (1) và (2), bằng bất kỳ cách giải thích hợp lý nào. Nó cũng tệ hơn theo nhiều cách khác:
- (3) Rõ ràng là bit có ý nghĩa nhất XOR bị sai lệch, nghĩa là có tần số không bằng nhau là 0 và 1, không giống như bất kỳ vị trí bit được đánh số nào trong cả hai đầu vào đều không thiên vị.
- (4) Trên thực tế, đối với mọi vị trí bit, có các cặp hạt mà vị trí bit đó bị sai lệch trong kết quả XOR và đối với mỗi cặp hạt giống, có (ít nhất 5) vị trí bit bị sai lệch trong XOR kết quả.
- (5) Khoảng thời gian của toàn bộ chuỗi giá trị 15 bit trong kết quả XOR là 1 hoặc , so với cho bản gốc.214215
Không ai trong số (3), (4), (5) là rõ ràng, nhưng tất cả chúng đều dễ dàng kiểm chứng.
Cuối cùng, hãy xem xét giới thiệu lại việc cấm PRNG từ cùng một gia đình. Vấn đề ở đây, tôi nghĩ, là không bao giờ thực sự rõ ràng liệu hai PRNG có "cùng một gia đình" hay không, cho đến khi / trừ khi ai đó bắt đầu sử dụng XOR và thông báo (hoặc thông báo kẻ tấn công) mọi thứ trở nên tồi tệ hơn theo nghĩa (1) và (2), tức là cho đến khi các mẫu không ngẫu nhiên trong đầu ra vượt qua ngưỡng từ không chú ý đến chú ý / lúng túng / thảm họa, và tại thời điểm đó thì đã quá muộn.
Tôi hoảng hốt trước những câu trả lời khác ở đây đưa ra lời khuyên không đủ tiêu chuẩn "XOR không thể làm tổn thương" trên cơ sở các biện pháp lý thuyết mà tôi thấy là làm một công việc kém về mô hình hóa mà hầu hết mọi người cho là "tốt" và "xấu" PRNG trong cuộc sống thực. Lời khuyên đó bị mâu thuẫn bởi các ví dụ rõ ràng và trắng trợn trong đó XOR làm cho mọi thứ tồi tệ hơn, ví dụ như rand () được đưa ra ở trên. Mặc dù có thể hình dung rằng các PRNG tương đối "mạnh" có thể liên tục hiển thị hành vi ngược lại khi XOR với PRNG đồ chơi đó là rand (), do đó làm cho XOR trở thành một ý tưởng tốt cho chúng, tôi đã không thấy bằng chứng nào về hướng đó, theo lý thuyết hoặc theo kinh nghiệm, nên có vẻ không hợp lý với tôi khi cho rằng điều đó xảy ra.
Cá nhân, tôi đã bị cắn bởi sự bất ngờ của XORing rand () khi còn trẻ và vô số mối tương quan bất ngờ khác trong suốt cuộc đời tôi, tôi không có nhiều lý do để nghĩ rằng kết quả sẽ khác nếu tôi thử lại chiến thuật tương tự. Đó là lý do tại sao tôi, cá nhân, sẽ rất miễn cưỡng XOR cùng với nhiều PRNG trừ khi phân tích và kiểm tra rất sâu rộng đã được thực hiện để cho tôi một sự tin tưởng rằng có thể an toàn khi làm như vậy đối với các RNG cụ thể được đề cập. Là một phương pháp chữa bệnh tiềm năng khi tôi có niềm tin thấp vào một hoặc nhiều PRNG riêng lẻ, XOR chúng không có khả năng làm tăng sự tự tin của tôi, vì vậy tôi không thể sử dụng nó cho mục đích như vậy. Tôi tưởng tượng câu trả lời cho câu hỏi của bạn là đây là một tình cảm được tổ chức rộng rãi.