Ist Random.NextBytes voreingenommen?

9

Die .NET-Referenzquelle zeigt die Implementierung von NextBytes() wie folgt an:

%Vor%

InternalSample liefert einen Wert in [0, int.MaxValue], was durch den Dokumentationskommentar und die Tatsache belegt wird, dass Next() , für die dokumentiert wird, dass sie diesen Bereich zurückgibt, einfach InternalSample aufruft.

Meine Sorge ist, dass, da InternalSample int.MaxValue verschiedene Werte erzeugen kann, und diese Zahl nicht durch 256 teilbar ist, dann sollten wir eine leichte Verzerrung in den resultierenden Bytes haben, mit einigen Werten (in diesem Fall nur 255) weniger häufig auftreten als andere.

Meine Frage ist:

  1. Ist diese Analyse korrekt oder ist die Methode tatsächlich unvoreingenommen?
  2. Wenn die Voreingenommenheit besteht, ist sie stark genug, um für irgendeine reale Anwendung wichtig zu sein?

FYI Ich weiß, dass Random nicht für kryptografische Zwecke verwendet werden sollte; Ich denke über seine gültigen Anwendungsfälle (z. B. Simulationen) nach.

    
ChaseMedallion 23.12.2015, 12:18
quelle

1 Antwort

-3

Siehe Knuth vol. 2, 3.2.1.1 Wahl des Moduls. Sie wollen tatsächlich einen Modul, der nicht gleich 256 ist; Unter Verwendung von 256 sind die unteren 4 Bits des resultierenden Bytes wesentlich weniger zufällig als bei Verwendung von 257 (S. 12).

257 ist auch prim, was praktisch ist, um Verzerrungen zu reduzieren und die pseudozufällige Sequenz zu verlängern.

Jede pseudozufällige Sequenz ist definitionsgemäß nicht wirklich zufällig. Für nicht-kryptografische Anwendungen: Was ist unvoreingenommen genug ? Im Zweifelsfall empfehle ich, die generierten Zahlen so zu analysieren, wie sie von Ihrer Anwendung gezeichnet werden, und eine statistische Analyse durchzuführen. Die Standard-Zufallszahlengeneratoren sind für viele Anwendungen gut genug, aber nicht unbedingt gut genug für Ihre.

    
S. Rojak 23.12.2015 15:59
quelle

Tags und Links