Pour un peu plus de contexte:
Un temps, j'ai complètement analysé cette mise en œuvre. J'ai trouvé quelques différences.
A la première (à la perfection) est une autre grande valeur (MBIG
). Numerical Recipies prétend que Knuth il est clair que toute grande valeur doit travailler, ce qui n'est pas un problème, et Microsoft raisonnablement choisi d'utiliser la plus grande valeur d'un entier de 32 bits.
La deuxième, c'est que constante, vous l'avez mentionné. Que l'on est une grosse affaire. Au minimum, il sera de réduire considérablement la période. Il ya eu des rapports que les effets sont en fait pire que ça.
Mais ensuite vient un autre particulièrement méchante différence. Il est littéralement une garantie de polarisation de la sortie (car il ne fait donc directement), et seront également susceptibles d'affecter la période de la RNG.
Quelle est donc cette deuxième question? Lors de l' .NET sortis pour la première fois, Microsoft n'a pas réalisé que le RNG ils ont codé était ouverte à ses deux extrémités, et ils ont décrit comme exclusif au maximum de la fin. Pour résoudre ce problème, l'équipe de sécurité de l'ajout d'un assez de mal de ligne de code: if (retVal == MBIG) retVal--;
. C'est très malheureusement, comme le bon correctif serait littéralement seulement 4 caractères ajoutés (en plus des espaces).
Le bon correctif aurait été de changer de MBIG
de int.MaxValue-1
, mais le commutateur Sample()
utilisation MBIG+1
(c'est à dire de continuer à utiliser int.MaxValue
). Ce qui garantirait que l'Échantillon a l'intervalle [0.0, 1.0) sans introduire de biais, et seules les modifications de la valeur de MBIG
qui Numerical Recipies dit Knuth a dit est parfaitement bien.