Bunu bir şans vereceğim, çünkü diğer bazı cevaplarda verilen tavsiyelerden yeterince rahatsız oluyorum.
Let (ille ilk durum bilinen bir kez belirli olmayan PRNGs) iki RNG'ler tarafından üretilen sonsuz bit dizileri, ve sırası kullanma imkanı Deniyorsun davranışı bir anlamda iyileştirme umuduyla. in ve her birine göre daha iyi veya daha kötü olarak değerlendirilebileceği pek çok farklı yol vardır ; Burada "daha iyi" ve "daha kötü" kelimelerinin normal kullanımıyla anlamlı, kullanışlı ve tutarlı olduğuna inandığım küçük bir avuç:X⃗ ,Y⃗ X⃗ ⊕Y⃗ X⃗ ⊕Y⃗ X⃗ Y⃗
- (0) Dizinin gerçek rasgelelik olasılığı, artar veya azalır.
- (1) Gözlenebilir rastgele olmama olasılığı artar veya azalır (bazı gözlemcilere göre, belirli miktarda inceleme uygulayan, muhtemelen)
- (2) Gözlenebilir rastgele olmama derecesinin şiddeti / açıklığı artar veya azalır.
Öncelikle, kesin olarak yapılacak ümidi olan üç kişiden sadece biri olan (0) hakkında düşünelim. Aslında, iki girdi RNG'den birinin gerçekten gerçekten rastgele, tarafsız ve diğerinden bağımsız olması durumunda, XOR sonucunun da gerçekten rastgele ve tarafsız olacağına dikkat edin. Bunu göz önünde bulundurarak, nin gerçekten rastgele yansız yalıtılmış bit akışları olduğuna inandığınızda durumu düşünün , ancak tam olarak emin değilsiniz. Eğer bunların her biri hakkında yanılıyorsun ilgili olasılıklar, daha sonra olasılık vardır o zaman-gerçekten rasgele değildir
, aslında çok daha azX⃗ ,Y⃗ εX,εYX⃗ ⊕Y⃗ ≤εXεY<min{εX,εY}εX,εY , 0'a çok yakın kabul edilir ("gerçekten rastgele olduklarına inanıyorsunuz"). Ve aslında, bundan daha da iyidir, biz de ihtimalinin her ikisinin de rastgele olmadığı durumlarda bile gerçekten bağımsız olma ihtimalini göz önüne aldığımızda :
Dolayısıyla, (0) anlamında, XOR'un incitemeyeceği ve potansiyel olarak çok yardımcı olabileceği sonucuna varabiliriz.X⃗ ,Y⃗
Pr(X⃗ ⊕Y⃗ not truly random)≤min{Pr(X⃗ not truly random),Pr(Y⃗ not truly random),Pr(X⃗ ,Y⃗ dependent)}.
Bununla birlikte, (0) PRNG'ler için ilginç değildir, çünkü PRNG'ler söz konusu olduğunda hiçbir sekansın rastgele olma şansı yoktur.
Bu yüzden aslında PRNG'lerle ilgili olan bu soru için, (1) veya (2) gibi bir şeyden bahsetmeliyiz. Bunlar "gözlemlenebilir", "şiddetli", "açık", "belirgin" gibi özellikler ve nicelikler bakımından olduğundan, şimdi Kolmogorov karmaşıklığından bahsediyoruz ve bunu kesin yapmaya çalışmayacağım. Ancak, "01100110 ..." (dönem = 4) 'ün "01010101 ..." (dönem = 2) değerinden daha kötü olduğunu ümitsizce tartışmasız bir iddiaya sokacak kadar ileri gideceğim. 00000000 ... "(sabit).
Şimdi, biri (1) ve (2) 'nin (0) ile aynı eğilimi takip edeceğini ve bu nedenle “XOR'un incitemeyeceği” sonucunun hala geçerli olabileceğini tahmin edebilir. Bununla birlikte, ne ne de nin gözle görülür şekilde rastlantısal olmadığı, ancak aralarındaki korelasyonların nin gözle görülür biçimde rastgele neden olduğunu . Bunun en ciddi örneği elbette, (veya ), bu durumda sabittir, olası tüm sonuçlardan en kötüsü; Genel olarak, ne olursa olsun ne kadar iyi arasında olduğunu görmek kolaydır ve vardır,→ Y → X ⊕ → Y → X = → Y → X =not( → Y ) → X ⊕ → Y → X → Y → X → Y → X ⊕ → YX⃗ Y⃗ X⃗ ⊕Y⃗ X⃗ =Y⃗ X⃗ =not(Y⃗ )X⃗ ⊕Y⃗ X⃗ Y⃗ X⃗ ve , xorlarının gözlemlenemeyen ve rasgele olmayan olmaları için bağımsızlığa "yakın" olmalıdır. Aslında, gözlemlenebilir bir şekilde bağımlı olmamak, makul olarak in gözlemlenemeyen bir olduğu şeklinde tanımlanabilir .Y⃗ X⃗ ⊕Y⃗
Böyle bir sürpriz bağımlılığı gerçekten büyük bir sorun olarak ortaya çıkıyor.
Neyin yanlış gittiğine bir örnek
"Aynı aileden olduğu gibi birlikte çalışan birkaç lineer geri bildirim kayma kaydının ortak örneğini hariç tutuyorum. Ancak, XORing ile yanlış gidebilecek türden çok basit ve net gerçek hayattan bir örnek vermek için, şu an için bu dışlamayı dışlayacağım.
Örneğim 1983 dolaylarında Unix'in bazı sürümlerinde olan eski bir rand () uygulaması olacak. IIRC, rand () işlevinin bu uygulaması aşağıdaki özelliklere sahipti:
- rand () için yapılan her çağrının değeri, sözde rastgele bit olan 15 ([0, 32767) aralığında bir tamsayıydı.
- ardışık geri dönüş değerleri çift-tek-tek-değişken; yani, en az anlamlı bit 0-1-0-1 değişimli ...
- en önemsiz anlamlı bit 4'üncü, sonraki 8 periyodu, en yüksek dereceli bit ise .215
- bu nedenle rand () 'ın 15-bitlik dönüş değerlerinin sırası periyot ile periyodikti .215
Orijinal kaynak kodunu bulamadım ancak https://groups.google.com/forum/#!topic/comp.os.vms/9k4W6KrRV3A’daki birkaç yazıyı bir araya getirmeyi tahmin ediyorum . tam da aşağıdaki özelliklere dair hafızamla aynı fikirde olan aşağıdakileri (C kodu) yaptı:
#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;
}
Tahmin edilebileceği gibi, bu rand () yöntemini çeşitli şekillerde kullanmaya çalışmak, çeşitli hayal kırıklıklarına neden oldu.
Örneğin, bir noktada, art arda alarak, rastgele bozuk para dizileri dizisini simüle etmeye çalıştım:
rand() & 1
yani en az anlamlı bit. Sonuçta basit dönüşüm kafaları-kuyrukları-kafaları-kuyrukları oldu. İlk başta inanmak zordu (programımda bir hata olmalı!), Ancak kendimi ikna ettikten sonra bunun yerine en az önemsiz olan parçayı kullanmayı denedim. Daha önce de belirtildiği gibi bu çok daha iyi değil - bu bit 4. periyotla periyodiktir. Ardışık olarak daha yüksek bitleri araştırmaya devam etmek, daha önce kaydettiğim kalıbı ortaya çıkardı: yani, bir sonraki her yüksek dereceli bit, önceki sürenin iki katıydı; Bu saygı en yüksek dereceli bit, hepsinden daha yararlı oldu. Bununla birlikte, burada "bit yararlı, bit kullanışlı değildir" siyah-beyaz eşiğinin olmadığını unutmayın; Gerçekten söyleyebileceğimiz tek şey, numaralandırılmış bit konumlarının değişen derecelerde yararlılık / yararsızlığa sahip olmasıdır.i - 1ii−1
Ayrıca sonuçları daha fazla karıştırmak ya da çoklu çağrılardan rand () öğesine döndürülen değerleri bir araya getirmek gibi şeyler de denedim. Art arda rand () değerlerinin XORing çiftleri bir felaketti, elbette ki tüm garip rakamlarla sonuçlandı! Amaçlarım için (yani, "görünüşte rastgele" bir bozuk para dizisi dizisi üretmek), XOR'un sabit parite sonucu, orijinalin alternatif garip davranışından bile daha kötüydü.
Hafif bir değişiklik bunu orijinal çerçeveye yerleştirir: yani, , rand () tarafından verilen ile döndürülen 15 bitlik değerlerin dizisi ve farklı bir diziden . Yine, , orjinal değişken çift / tek davranıştan daha kötü olan tek ya da tamamen tek sayılar dizisi olacaktır. sx → Y s, Y → X ⊕ → YX⃗ sXY⃗ sYX⃗ ⊕Y⃗
Başka bir deyişle, bu, XOR'un (1) ve (2) anlamında herhangi bir makul yorumla işleri daha da kötüleştirdiği bir örnektir. Birkaç yönden de daha kötü:
- (3) XORed en az anlamlı biti açıkça önyargılıdır, yani girişlerin her ikisinde de tarafsız olan herhangi bir numaralı bit konumunun aksine 0 ve 1'lerin eşit olmayan frekanslarına sahiptir.
- (4) Aslında, her bit pozisyonu için, XOR sonucundaki bit pozisyonunun önyargılı olduğu tohum çiftleri vardır ve her tohum çifti için, XOR'da bastırılan (en az 5) bit pozisyonu vardır. sonuç.
- (5) XOR sonucundaki tüm 15 bitlik değer dizisinin tamamı , orijinaller için e kıyasla, 1 veya . 2 15214215
(3), (4), (5) 'den hiçbiri açık değildir, ancak hepsi kolayca doğrulanabilir.
Son olarak, PRNG'lerin yasaklanmasını aynı aileden tekrar başlatmayı düşünelim. Bence buradaki sorun, iki PRNG'nin "aynı aileden" olup olmadığına, biri XOR kullanmaya başlamadan ve duygular (veya bir saldırganın bildirimleri) anlamında hiçbir şeyin daha kötüye gitmediğine kadar asla net olmadığıdır (1). ve (2), yani çıktıdaki rastgele olmayan modeller fark edilmeden farkedilene / utanç verici / felakete kadar olan eşiği geçene kadar ve bu noktada çok geç.
Burada, çoğu insanın "iyi" ve "kötü" olduğunu düşündüğü bir modelleme işi yaptığım teorik önlemlere dayanarak "XOR'un zarar veremeyeceği" niteliksiz tavsiyelerde bulunan diğer cevaplar beni korkutuyor Gerçek hayatta PRNG'ler. Bu tavsiye, XOR'un işleri daha da kötüleştirdiği açık ve net örneklerle, yukarıda verilen rand () örneğiyle çelişir. Göreceli olarak "güçlü" PRNG'lerin, XOR'un Rand () oyuncak PRNG'sine () göre XORed olduğunda ters davranış sergilemeleri düşünülebilir olsa da, XOR'u onlar için iyi bir fikir haline getirirken, bu yönde, teorik veya ampirik, bu yüzden bunun olduğunu varsaymak bana mantıksız geliyor.
Şahsen, gençliğimde XORing rand () 'ın sürpriziyle ısırıldığını ve hayatım boyunca sayısız diğer sürpriz ilişkilerini sürdürdüğümde, benzer taktikleri tekrar denersem, sonucun farklı olacağını düşünmek için çok az nedenim var. Bu nedenle, şahsen, söz konusu RNG'ler için bunu yapmanın güvenli olacağına dair bazı güven vermemiz için çok kapsamlı bir analiz ve titizlik göstermediği sürece, birçok PRNG'yi birlikte XOR için çok isteksiz olacağım. Bireysel PRNG'lerden birine veya daha fazlasına güvenim düşük olduğunda ortaya çıkacak potansiyel bir tedavi olarak, bunları XORing güvenimi arttırması pek mümkün değil, bu yüzden böyle bir amaç için kullanmıyorum. Sorunuzun cevabını, bunun yaygın bir şekilde algılanan bir düşünce olduğunu hayal ediyorum.