私はこれを試してみます。他の回答のいくつかで与えられたアドバイスに十分に悩まされているからです。
ましょう無限ビット列2つのRNG(初期状態がわかれば、決定論的である必要はないのPRNG)によって生成され、我々はシーケンスを使用する可能性を検討していることは、何らかの意味で動作を改善することを期待しています。とそれぞれと比較して、がより良いまたはより悪いと考えられるさまざまな方法があります。ここに、「より良い」と「より悪い」という言葉の通常の用法と意味があり、有用で、一貫していると私が信じるほんの一握りがあります。X⃗ ,Y⃗ X⃗ ⊕Y⃗ X⃗ ⊕Y⃗ X⃗ Y⃗
- (0)シーケンスの真のランダム性の確率が増加または減少
- (1)観測可能な非ランダム性の増加または減少の確率(おそらく、特定の量の精査を適用する一部のオブザーバーに関して)
- (2)観測可能な非ランダム性の重大度/自明性は増加または減少します。
最初に(0)について考えてみましょう。これは、3つのうち、正確になることを望んでいる唯一のものです。実際に、2つの入力RNGのいずれかが実際にランダムで不偏であり、他方から独立している場合、XORの結果も同様にランダムで不偏になります。それを念頭に置いて、が真にランダムな不偏分離ビットストリームであると信じている場合を考えてみてください。場合はあなたがそれらのそれぞれについて間違っているそれぞれの確率は、確率ですあり、その後、真にランダムされていません
、実際にはずっと少ないX⃗ ,Y⃗ εX,εYX⃗ ⊕Y⃗ ≤εXεY<min{εX,εY}εX,εYは0に非常に近いと仮定されます(「それらは本当にランダムであると信じています」)。そして、実際には、どちらも真にランダムではない場合でも、が真に独立している可能性を考慮すると、それよりもさらに優れています。
したがって、理にかなっている(0)ので、XORを傷つけることはできず、潜在的に多くの助けになると結論付けることができます。X⃗ ,Y⃗
Pr(X⃗ ⊕Y⃗ not truly random)≤min{Pr(X⃗ not truly random),Pr(Y⃗ not truly random),Pr(X⃗ ,Y⃗ dependent)}.
ただし、(0)はPRNGにとって興味深いものではありません。PRNGの場合、問題のシーケンスはどれも真にランダムになる可能性がないためです。
したがって、実際にはPRNGに関するこの質問については、(1)または(2)のようなものについて話す必要があります。それらは「観察可能」、「重度」、「明白」、「見かけ」などの特性と量の点であるため、コルモゴロフの複雑さについて話しているので、正確にしようとはしません。しかし、このような手段によって、「01100110 ...」(期間= 4)は「01010101 ...」(期間= 2)よりも悪いという希望を持たない主張をするまで行きます。 00000000 ... "(定数)。
さて、(1)と(2)は(0)と同じ傾向に従うと推測するかもしれません。したがって、「XORは傷つけない」という結論がまだ当てはまるかもしれません。ただし、とはどちらも明らかにランダムではないが、それらの間の相関によりが明らかにランダムではないという重要な可能性に注意してください。この最も深刻なケースは、もちろん、(または)の場合です。この場合、は定数であり、考えられるすべての結果の中で最悪です。一般に、とがどれだけ優れているかに関係なく、X⃗ Y⃗ X⃗ ⊕Y⃗ X⃗ =Y⃗ X⃗ =not(Y⃗ )X⃗ ⊕Y⃗ X⃗ Y⃗ X⃗ そしては、xorが観測不可能な非ランダムになるように、独立に「近い」必要があります。実際、観測不可能に依存するということは、が観測不可能な非ランダムであると合理的に定義できます。Y⃗ X⃗ ⊕Y⃗
このようなサプライズ依存は、本当に大きな問題であることがわかりました。
何がうまくいかないかの例
質問には、「同じファミリのものであるため、いくつかの線形フィードバックシフトレジスタが一緒に機能する一般的な例を除外しています」とあります。ただし、XORingで問題が発生する可能性のある種類の非常に単純で明確な実例を示すために、当面はこの除外を除外します。
私の例は、1983年頃のUnixの一部のバージョンにあったrand()の古い実装です。IIRC、このrand()関数の実装には、次のプロパティがありました。
- rand()の各呼び出しの値は15の擬似ランダムビット、つまり範囲[0、32767)の整数でした。
- 連続する戻り値は、偶数-奇数-偶数-奇数を交互にしました。つまり、最下位ビットが0-1-0-1を交互に...
- 最下位から番目のビットには期間4があり、その後の次のビットには期間8があり、...最上位ビットには期間。215
- したがって、rand()の15ビットの戻り値のシーケンスは、周期周期的でした。215
私は、元のソースコードを見つけることができなかったが、私は中からポストのカップルを一緒に縫い合わせから推測しているhttps://groups.google.com/forum/#!topic/comp.os.vms/9k4W6KrRV3Aこと上記のプロパティの私の記憶と一致する、正確に次のコード(Cコード)を実行しました。
#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;
}
ご想像のとおり、このrand()をさまざまな方法で使用しようとすると、さまざまな失望が生じました。
たとえば、ある時点で、次のことを繰り返して、コインのランダムフリップのシーケンスをシミュレートしようとしました。
rand() & 1
すなわち、最下位ビット。結果は、単純な交互の頭-尾-頭-尾でした。それは最初は信じ難かったです(私のプログラムのバグでなければなりません!)。前述のように、それはあまり良くありません-そのビットは周期4で周期的ですこの点に関して、最上位ビットがそれらすべての中で最も有用でした。ただし、ここでは「ビットは有用ですが、ビットは有用ではありません」という白黒のしきい値はありません。実際に言えるのは、番号付きのビット位置にさまざまな程度の有用性/無用性があることです。ii−1
また、結果をさらにスクランブルしたり、複数のrand()の呼び出しから返された値をXORしたりすることも試みました。連続したrand()値のペアのXORは、もちろん災害でした。すべての奇数が発生しました。私の目的(つまり、コインフリップの「見かけ上ランダム」なシーケンスを生成する)では、XORの一定のパリティの結果は、元の交互奇数/偶数動作よりもさらに悪化しました。
わずかなバリエーションにより、これは元のフレームワークに入れられます。つまり、を、特定のシード持つrand()によって返される15ビット値のシーケンスとし、異なるシードからのシーケンスとします。繰り返しになりますが、は、すべて偶数またはすべて奇数のシーケンスであり、元の偶数/奇数の交互動作よりも悪化します。X⃗ sXY⃗ sYX⃗ ⊕Y⃗
言い換えれば、これは、XORが(1)と(2)の意味で、合理的な解釈によって事態を悪化させた例です。他のいくつかの点でも同様です。
- (3)XORされた最下位ビットは明らかにバイアスされています。つまり、すべてのバイアスのない入力のいずれかの番号付きビット位置とは異なり、0と1の周波数が等しくありません。
- (4)実際、ビット位置ごとに、そのビット位置がXOR結果でバイアスされるシードのペアがあり、シードのすべてのペアで、XORでバイアスされる(少なくとも5つの)ビット位置があります結果。
- (5)XOR結果の15ビット値のシーケンス全体の周期は、元のと比較して1またはいずれかです。214215
(3)、(4)、(5)のどれも明らかではありませんが、それらはすべて簡単に検証可能です。
最後に、同じファミリーのPRNGの禁止を再導入することを検討しましょう。ここでの問題は、誰かがXORの使用を開始し、(1)の意味で事態が悪化したことに気づかない限り(または、攻撃者が気づかない限り)、2つのPRNGが「同じファミリーから」であるかどうかは本当に明確ではないことです(2)、つまり、出力のランダムでないパターンが、気付かないから気づいた/恥ずかしい/悲惨な状態にしきい値を超えるまで、その時点では手遅れです。
私はここで、ほとんどの人が「良い」と「悪い」と考えるものをモデル化するという貧弱な仕事をしているように見える理論的尺度に基づいて「XORは傷つけない」という無条件のアドバイスを与える他の答えに驚いています現実のPRNG。そのアドバイスは、上記のrand()の例のように、XORが事態を悪化させる明確で露骨な例と矛盾しています。比較的「強い」PRNGが、rand()であるおもちゃのPRNGのXORとXORをとると、一貫して反対の動作を示す可能性があると考えられますが、XORを良いアイデアにしますが、その方向、理論、または経験的であるので、それが起こると仮定することは私にとって不合理なようです。
個人的には、青春期にrand()をXORすることや、生涯を通じて他の無数のさまざまな驚きの相関関係に驚かされたので、同様の戦術をもう一度試しても結果が異なると考える理由はほとんどありません。そのため、個人的には、問題の特定のRNGに対して安全であると確信できるように非常に広範な分析と検証が行われていない限り、複数のPRNGをXORで結合することに非常に消極的です。1つまたは複数の個々のPRNGに対する信頼度が低い場合の潜在的な治療法として、それらのXORを実行しても自信が増す可能性は低いため、このような目的に使用することはほとんどありません。あなたの質問に対する答えは、これが広く保持されている感情であると思います。