Saya akan mencoba ini, karena saya cukup terganggu dengan saran yang diberikan dalam beberapa jawaban lain.
Biarkan menjadi urutan bit tak terbatas yang dihasilkan oleh dua RNG (tidak harus PRNG yang bersifat deterministik begitu keadaan awal diketahui), dan kami sedang mempertimbangkan kemungkinan menggunakan urutan dengan harapan meningkatkan perilaku dalam beberapa hal. Ada banyak cara berbeda di mana dapat dianggap lebih baik atau lebih buruk dibandingkan dengan masing-masing dari dan ; di sini ada segelintir kecil yang saya yakin bermakna, bermanfaat, dan konsisten dengan penggunaan normal kata "lebih baik" dan "lebih buruk":X⃗ ,Y⃗ X⃗ ⊕Y⃗ X⃗ ⊕Y⃗ X⃗ Y⃗
- (0) Probabilitas keacakan benar urutan meningkat atau menurun
- (1) Probabilitas kenaikan atau penurunan yang tidak acak yang dapat diamati (berkenaan dengan beberapa pengamat yang menerapkan sejumlah pengawasan tertentu, mungkin)
- (2) Tingkat keparahan / kejelasan non-keacakan yang diamati meningkat atau menurun.
Pertama mari kita pikirkan (0), yang merupakan satu-satunya dari ketiganya yang memiliki harapan untuk dibuat tepat. Perhatikan bahwa jika, pada kenyataannya, salah satu dari dua input RNG benar-benar acak, tidak memihak, dan independen dari yang lain, maka hasil XOR akan benar-benar acak dan tidak bias juga. Dengan mengingat hal itu, pertimbangkan kasus ketika Anda meyakini sebagai stream bit terisolasi terisolasi yang benar-benar acak, tetapi Anda tidak sepenuhnya yakin. Jika adalah masing-masing probabilitas yang Anda salah tentang masing-masing, maka probabilitas bahwa tidak-benar-acak adalah
, sebenarnya jauh lebih sedikit sejakX⃗ ,Y⃗ εX,εYX⃗ ⊕Y⃗ ≤εXεY<min{εX,εY}εX,εY dianggap sangat mendekati 0 ("Anda yakin mereka benar-benar acak"). Dan faktanya bahkan lebih baik dari itu, ketika kita juga memperhitungkan kemungkinan menjadi benar-benar independen bahkan ketika keduanya tidak benar-benar acak:
Karena itu kita dapat menyimpulkan bahwa dalam arti (0), XOR tidak bisa sakit, dan berpotensi banyak membantu.X⃗ ,Y⃗
Pr(X⃗ ⊕Y⃗ not truly random)≤min{Pr(X⃗ not truly random),Pr(Y⃗ not truly random),Pr(X⃗ ,Y⃗ dependent)}.
Namun, (0) tidak menarik untuk PRNG, karena dalam kasus PRNG tidak ada urutan yang dipertanyakan yang memiliki peluang untuk menjadi benar-benar acak.
Karena itu untuk pertanyaan ini, yang sebenarnya tentang PRNG, kita harus berbicara tentang sesuatu seperti (1) atau (2). Karena itu adalah dalam hal sifat dan jumlah seperti "dapat diamati", "parah", "jelas", "jelas", kita sekarang berbicara tentang kompleksitas Kolmogorov, dan saya tidak akan mencoba untuk membuat yang tepat. Tetapi saya akan melangkah lebih jauh dengan membuat pernyataan yang diharapkan tidak kontroversial bahwa, dengan ukuran seperti itu, "01100110 ..." (periode = 4) lebih buruk daripada "01010101 ..." (periode = 2) yang lebih buruk daripada " 00000000 ... "(konstan).
Sekarang, orang mungkin menebak bahwa (1) dan (2) akan mengikuti tren yang sama dengan (0), dan oleh karena itu kesimpulan "XOR tidak dapat terluka" mungkin masih berlaku. Namun, catat kemungkinan signifikan bahwa baik maupun yang diamati non-acak, tetapi korelasi di antara mereka menyebabkan secara non-acak dapat diamati. Kasus yang paling parah dari ini, tentu saja, adalah ketika (atau ), dalam hal ini konstan, yang terburuk dari semua hasil yang mungkin; secara umum, mudah untuk melihat itu, terlepas dari seberapa bagus dan ,X⃗ Y⃗ X⃗ ⊕Y⃗ X⃗ =Y⃗ X⃗ =not(Y⃗ )X⃗ ⊕Y⃗ X⃗ Y⃗ X⃗ dan harus "dekat" dengan independen agar xornya menjadi non-acak. Pada kenyataannya, menjadi tidak tergantung secara wajar dapat didefinisikan sebagai menjadi tidak dapat diobservasi-nonrandom.Y⃗ X⃗ ⊕Y⃗
Ketergantungan yang mengejutkan seperti itu ternyata menjadi masalah yang sangat besar.
Contoh dari apa yang salah
Pertanyaannya menyatakan "Saya tidak termasuk contoh umum dari beberapa register shift umpan balik linier yang bekerja bersama karena mereka berasal dari keluarga yang sama". Tetapi saya akan mengecualikan pengecualian itu untuk saat ini, untuk memberikan contoh nyata yang sangat sederhana tentang hal-hal yang bisa salah dengan XORing.
Contoh saya adalah implementasi rand () lama yang ada pada beberapa versi Unix sekitar tahun 1983. IIRC, implementasi fungsi rand () ini memiliki properti berikut:
- nilai setiap panggilan ke rand () adalah 15 bit pseudo-acak, yaitu bilangan bulat dalam kisaran [0, 32767).
- nilai pengembalian berurutan berganti genap-ganjil-genap; yaitu, bit paling tidak signifikan berganti 0-1-0-1 ...
- bit berikutnya-ke-paling tidak signifikan memiliki periode 4, berikutnya setelah itu memiliki periode 8, ... sehingga bit urutan tertinggi memiliki periode .215
- oleh karena itu urutan nilai pengembalian 15-bit rand () adalah periodik dengan periode .215
Saya tidak dapat menemukan kode sumber asli, tetapi saya menduga dari menyatukan beberapa posting dari di https://groups.google.com/forum/#!topic/comp.os.vms/9k4W6KrRV3A yang ia melakukan persis yang berikut (kode C), yang sesuai dengan ingatan saya tentang properti di atas:
#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;
}
Seperti yang mungkin dibayangkan, mencoba menggunakan rand ini () dengan berbagai cara menyebabkan bermacam-macam kekecewaan.
Misalnya, pada satu titik saya mencoba mensimulasikan urutan membalik koin acak dengan berulang kali mengambil:
rand() & 1
yaitu bit paling signifikan. Hasilnya adalah pergantian kepala-ekor-kepala-ekor yang sederhana. Itu sulit dipercaya pada awalnya (pasti ada bug di program saya!), Tetapi setelah saya meyakinkan diri sendiri itu benar, saya mencoba menggunakan bit berikutnya yang paling tidak signifikan. Itu tidak jauh lebih baik, seperti disebutkan sebelumnya - bit itu adalah periodik dengan periode 4. Terus mengeksplorasi bit-bit yang lebih tinggi secara berturut-turut mengungkapkan pola yang saya catat sebelumnya: yaitu, setiap bit orde tinggi berikutnya memiliki dua kali periode sebelumnya, jadi dalam hormat ini bit orde tertinggi adalah yang paling berguna dari semuanya. Namun perhatikan bahwa tidak ada ambang hitam-putih "bit berguna, bit tidak berguna" di sini; yang bisa kita katakan adalah posisi bit bernomor memiliki tingkat kegunaan / kegunaan yang berbeda-beda.ii−1
Saya juga mencoba hal-hal seperti mengacak hasil lebih lanjut, atau XORing bersama nilai yang dikembalikan dari beberapa panggilan ke rand (). XORing pasangan rand () nilai yang berurutan adalah bencana, tentu saja - itu menghasilkan semua angka ganjil! Untuk tujuan saya (yaitu menghasilkan urutan membalik koin yang tampaknya acak), hasil paritas konstan XOR bahkan lebih buruk daripada perilaku bolak-balik genap asli.
Variasi sedikit menempatkan ini ke dalam kerangka kerja asli: yaitu, mari menjadi urutan nilai 15-bit yang dikembalikan oleh rand () dengan seed diberikan , dan urutan dari seed yang berbeda . Sekali lagi, akan menjadi urutan angka all-even atau all-odd, yang lebih buruk daripada perilaku genap even / odd.X⃗ sXY⃗ sYX⃗ ⊕Y⃗
Dengan kata lain, ini adalah contoh di mana XOR memperburuk keadaan dalam arti (1) dan (2), oleh interpretasi yang masuk akal. Lebih buruk dalam beberapa hal lain juga:
- (3) Bit-paling-signifikan XOR jelas-jelas bias, yaitu memiliki frekuensi yang tidak sama antara 0 dan 1, tidak seperti posisi bit bernomor dalam salah satu input yang semuanya tidak bias.
- (4) Faktanya, untuk setiap posisi bit, ada pasangan biji yang posisi bitnya bias dalam hasil XOR, dan untuk setiap pasangan biji, ada (setidaknya 5) posisi bit yang bias dalam XOR hasil.
- (5) Periode seluruh urutan nilai 15-bit dalam hasil XOR adalah 1 atau , dibandingkan dengan untuk aslinya. 2 15214215
Tidak satu pun dari (3), (4), (5) yang jelas, tetapi semuanya mudah diverifikasi.
Akhirnya, mari pertimbangkan untuk memperkenalkan kembali larangan PRNG dari keluarga yang sama. Masalahnya di sini, saya pikir, adalah tidak pernah benar-benar jelas apakah dua PRNG adalah "dari keluarga yang sama", sampai / kecuali seseorang mulai menggunakan XOR dan pemberitahuan (atau pemberitahuan penyerang) hal-hal menjadi lebih buruk dalam arti (1) dan (2), yaitu sampai pola-pola non-acak dalam keluaran melewati ambang batas dari tidak diperhatikan menjadi diperhatikan / memalukan / berbahaya, dan pada saat itu sudah terlambat.
Saya khawatir dengan jawaban lain di sini yang memberikan saran yang tidak memenuhi syarat "XOR tidak ada salahnya" atas dasar langkah-langkah teoritis yang menurut saya melakukan pekerjaan yang buruk dalam pemodelan apa yang kebanyakan orang anggap sebagai "baik" dan "buruk" tentang PRNG dalam kehidupan nyata. Saran itu bertentangan dengan contoh-contoh yang jelas dan terang-terangan di mana XOR memperburuk keadaan, seperti contoh rand () yang diberikan di atas. Meskipun dapat dibayangkan bahwa PRNG yang relatif "kuat" dapat secara konsisten menampilkan perilaku yang berlawanan ketika XOR dibandingkan dengan mainan PRNG yang rand (), sehingga membuat XOR ide yang baik untuk mereka, saya belum melihat bukti ke arah itu, secara teori atau empiris, jadi sepertinya tidak masuk akal bagi saya untuk menganggap itu terjadi.
Secara pribadi, setelah digigit kejutan oleh XORing rand () di masa muda saya, dan oleh banyak korelasi kejutan beragam lainnya sepanjang hidup saya, saya memiliki sedikit alasan untuk berpikir hasilnya akan berbeda jika saya mencoba taktik yang sama lagi. Itulah sebabnya saya, secara pribadi, akan sangat enggan XOR bersama-sama beberapa PRNG kecuali jika analisis yang sangat luas dan pemeriksaan telah dilakukan untuk memberi saya kepercayaan diri bahwa mungkin aman untuk melakukannya untuk RNG tertentu yang dimaksud. Sebagai obat potensial ketika saya memiliki kepercayaan diri yang rendah pada satu atau lebih PRNG individu, XORing mereka tidak mungkin meningkatkan kepercayaan diri saya, jadi saya tidak mungkin menggunakannya untuk tujuan seperti itu. Saya membayangkan jawaban untuk pertanyaan Anda adalah bahwa ini adalah sentimen yang dipegang secara luas.