Je vais essayer, car les conseils donnés dans certaines des réponses me dérangent suffisamment.
Soit des séquences binaires infinies générées par deux RNG (pas nécessairement des PRNG déterministes une fois l'état initial connu), et nous envisageons d'utiliser la séquence dans l’espoir d’améliorer un comportement dans un certain sens. Il y a beaucoup de différentes façons dont pourrait être considéré comme le meilleur ou pire par rapport à chacun des et ; En voici une petite poignée qui, à mon avis, est significative, utile et conforme à l’usage normal des mots «meilleur» et «pire»:X⃗ ,Y⃗ X⃗ ⊕Y⃗ X⃗ ⊕Y⃗ X⃗ Y⃗
- (0) Probabilité que le vrai caractère aléatoire de la séquence augmente ou diminue
- (1) Probabilité d’augmentation ou de diminution du caractère non aléatoire observable (probablement par rapport à un observateur qui applique un degré de contrôle donné)
- (2) La gravité / l'évidence de la non-observabilité observable augmente ou diminue.
Pensons d’abord à (0), qui est le seul des trois à espérer être précisé. Notez que si, en fait, l'un des deux générateurs de signaux d'entrée est réellement aléatoire, impartial et indépendant de l'autre, le résultat XOR sera également réellement aléatoire et impartial. Dans cet esprit, considérons le cas où vous pensez que sont réellement des flux de bits isolés non aléatoires, mais vous n'êtes pas tout à fait sûr. Si sont les probabilités respectives que vous vous trompez sur chacune d'elles, alors la probabilité que ne soit pas vraiment aléatoire est alors
, en fait beaucoup moins depuisX⃗ ,Y⃗ εX,εYX⃗ ⊕Y⃗ ≤εXεY<min{εX,εY}εX,εY sont supposés très proches de 0 ("vous les croyez vraiment aléatoires"). Et en fait, c’est encore mieux que cela, lorsque nous prenons également en compte la possibilité de étant réellement indépendant même quand aucun d’eux n’est vraiment aléatoire:
Nous pouvons donc en conclure que dans le sens (0), XOR ne peut pas nuire et peut potentiellement beaucoup aider.X⃗ ,Y⃗
Pr(X⃗ ⊕Y⃗ not truly random)≤min{Pr(X⃗ not truly random),Pr(Y⃗ not truly random),Pr(X⃗ ,Y⃗ dependent)}.
Cependant, (0) n'est pas intéressant pour les PRNG, car dans le cas de ces derniers, aucune des séquences en question n'a de chance d'être réellement aléatoire.
Par conséquent, pour cette question, qui concerne en fait les PRNG, nous devons parler de quelque chose comme (1) ou (2). Puisque ce sont des propriétés et des quantités telles que "observable", "sévère", "évident", "apparent", nous parlons maintenant de la complexité de Kolmogorov, et je ne vais pas essayer de le préciser. Mais j'irai jusqu'à faire l'affirmation sans controverse, espérons-le, selon laquelle "01100110 ..." (période = 4) est pire que "01010101 ..." (période = 2), ce qui est pire que " 00000000 ... "(constante).
Maintenant, on peut supposer que (1) et (2) suivront la même tendance que (0) et que, par conséquent, la conclusion "XOR ne peut pas nuire" pourrait encore être valable. Cependant, notez la possibilité importante que ni ni soit visiblement non aléatoire, mais que leurs corrélations font que soit remarquablement non aléatoire. Le cas le plus grave en est évidemment lorsque (ou ), auquel cas est constant, le pire de tous les résultats possibles; en général, il est facile de voir que, indépendamment de la qualité de et de ,X⃗ Y⃗ X⃗ ⊕Y⃗ X⃗ =Y⃗ X⃗ =not(Y⃗ )X⃗ ⊕Y⃗ X⃗ Y⃗ X⃗ et doivent être "proches" de l'indépendance pour que leur xor soit non-observable-non-aléatoire. En fait, être dépendant non-observable peut raisonnablement être défini comme étant étant non-observable-non-aléatoire.Y⃗ X⃗ ⊕Y⃗
Une telle dépendance par surprise s'avère être un très gros problème.
Un exemple de ce qui ne va pas
La question dit "J'exclue l'exemple commun de plusieurs registres à décalage à retour linéaire fonctionnant ensemble car ils appartiennent à la même famille". Mais je vais exclure cette exclusion pour le moment, afin de donner un exemple très simple et réel du genre de choses qui peuvent mal tourner avec XORing.
Mon exemple sera une ancienne implémentation de rand () qui était sur une version d’Unix vers 1983. IIRC, cette implémentation de la fonction rand () avait les propriétés suivantes:
- la valeur de chaque appel à rand () était de 15 bits pseudo-aléatoires, c'est-à-dire un nombre entier compris dans la plage [0, 32767).
- valeurs de retour successives alternées pair-impair-pair-impair; c'est-à-dire que le bit le moins significatif a alterné 0-1-0-1 ...
- le bit le moins significatif suivant avait la période 4, le suivant après la période 8, ... donc le bit de poids fort avait la période .215
- Par conséquent, la séquence de valeurs de retour de 15 bits de rand () était périodique avec la période .215
Je suis incapable de trouver le code source d' origine, mais je devine de assemblant quelques messages de dans https://groups.google.com/forum/#!topic/comp.os.vms/9k4W6KrRV3A que il a précisément fait ce qui suit (code C), ce qui concorde avec ma mémoire des propriétés ci-dessus:
#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;
}
Comme on pourrait l’imaginer, essayer d’utiliser ce rand () de différentes manières a été source de nombreuses déceptions.
Par exemple, à un moment donné, j’ai essayé de simuler une séquence de lancers de pièces aléatoires en prenant à plusieurs reprises:
rand() & 1
c'est-à-dire le bit le moins significatif. Le résultat a été une simple alternance tête-queue-tête-queue. C'était difficile à croire au début (ça doit être un bug dans mon programme!), Mais après m'être convaincu que c'était vrai, j'ai essayé d'utiliser le bit suivant le moins significatif. Ce n'est pas beaucoup mieux, comme indiqué précédemment - ce bit est périodique avec la période 4. Continuer à explorer successivement les bits les plus élevés a révélé le motif que j'ai noté précédemment: chaque bit de poids à cet égard, le bit de poids fort était le plus utile de tous. Notez cependant qu'il n'y avait pas de seuil noir et blanc "le bit est utile, le bit n'est pas utile" ici; tout ce que nous pouvons vraiment dire, c’est que les positions des bits numérotés présentaient divers degrés d’utilité / d’inutilité.ii−1
J'ai aussi essayé des choses comme brouiller davantage les résultats ou XORing ensemble les valeurs renvoyées par plusieurs appels à rand (). XORing des paires de valeurs successives rand () était un désastre, bien sûr - il en résultait tous les nombres impairs! Pour mes besoins (à savoir produire une séquence "apparemment aléatoire" de retournements de pièces), le résultat de parité constante du XOR était encore pire que le comportement pair-impair alternatif de l'original.
Une légère variation place cela dans le cadre d'origine: c'est-à-dire que soit la séquence des valeurs de 15 bits renvoyées par rand () avec un germe donné , et la séquence d'un germe différent. . Encore une fois, sera une suite de nombres tous pairs ou tous impairs, ce qui est pire que le comportement original alternant pair / impair.X⃗ sXY⃗ sYX⃗ ⊕Y⃗
En d’autres termes, c’est un exemple où XOR a aggravé la situation au sens de (1) et (2), par toute interprétation raisonnable. C'est pire à plusieurs autres égards:
- (3) Le bit le moins significatif XORed est évidemment polarisé, c'est-à-dire qu'il a des fréquences inégales de 0 et de 1, contrairement à toute position de bit numérotée dans l'une des entrées qui sont toutes non biaisées.
- (4) En fait, pour chaque position de bit, il y a des paires de graines pour lesquelles cette position de bit est biaisée dans le résultat XOR, et pour chaque paire de graines, il y a (au moins 5) positions de bit qui sont biaisées dans le XOR. résultat.
- (5) La période de la séquence complète des valeurs de 15 bits dans le résultat XOR est égale à 1 ou , comparée à pour les originaux.214215
Aucun de (3), (4), (5) n’est évident, mais ils sont tous facilement vérifiables.
Enfin, considérons la réintroduction de l’interdiction des GNRP de la même famille. Le problème ici, je pense, est qu'il n'est jamais vraiment clair si deux PRNG appartiennent "à la même famille", jusqu'à ce que / à moins que quelqu'un ne commence à utiliser le XOR et remarque (ou un attaquant remarque) que les choses ont empiré (1) et (2), c'est-à-dire jusqu'à ce que des modèles non aléatoires dans la sortie franchissent le seuil de non-remarqué à remarqué / embarrassant / désastreux et qu'à ce stade, il est trop tard.
Je suis alarmé par d’autres réponses ici qui donnent des conseils sans réserve «XOR ne peut pas faire de mal» sur la base de mesures théoriques qui me semblent faire un piètre travail de modélisation de ce que la plupart des gens considèrent comme «bon» et «mauvais». PRNG dans la vraie vie. Ce conseil est contredit par des exemples clairs et flagrants dans lesquels XOR aggrave la situation, tels que l'exemple de rand () donné ci-dessus. Bien qu'il soit concevable que des PRNG relativement "forts" puissent systématiquement afficher le comportement inverse lorsque XOR est identique à celui du jouet PRNG qui était rand (), faisant ainsi de XOR une bonne idée pour eux, je n'ai vu aucune preuve dans cette direction, théorique ou empirique, il me semble donc déraisonnable de supposer que cela se produit.
Personnellement, après avoir été mordu par XORing rand () s dans ma jeunesse et par d’innombrables corrélations surprises tout au long de ma vie, j’ai peu de raisons de penser que le résultat sera différent si j’essaie à nouveau une tactique similaire. C'est pourquoi, personnellement, je serais très réticent à l'idée de combiner plusieurs PRNG avec XOR à moins que des analyses et des vérifications très approfondies aient été effectuées pour me donner une certaine assurance que cela pourrait être fait en toute sécurité pour les GNR en question. En tant que traitement potentiel lorsque j'ai peu confiance en un ou plusieurs PRNGs, il est peu probable que XORing augmente ma confiance en moi, il est donc peu probable que je l'utilise à cette fin. J'imagine que la réponse à votre question est qu'il s'agit d'un sentiment largement répandu.