Frage

Ich schreibe ein Programm, das in Delphi statistische Tests schreiben (müssen Delphi sein) und ich habe gehört, dass die Zufalls Funktionalität etwas ungerade ist. Sie haben randomize anrufen, um den Samen der Zufallsfunktion randomisieren, wenn das Programm startet.

Ich frage mich, ob die Zufallsfunktion (nach randomize Aufruf) ist zufällig genug für statistische Tests oder ein Mersenne-Twister benötigt? Hat jemand Einblick in zufälligen tatsächliche Implementierung, die mir sagen kann, wie wichtig das ist?

War es hilfreich?

Lösung

Ob Random ausreichend zuverlässig für Ihre statistischen Tests auf dem Kontext ab, in dem Sie beabsichtigen, es zu benutzen.

Having said that, ich habe mehrere Stücke von Delphi-Code geschrieben, dass Notwendigkeit, angemessene Statistiken zu tun, und verwendet hat Random z.B. für verschiedene Verteilungen null zu erhalten, Daten pseudo-Replikationen und resamplings. Bisher habe ich nicht über jeden Fall in meinem eigenen Code kommen, wo Random voreingenommen haben lieferte würde oder unzuverlässige Ergebnisse oder Ergebnisse, die seine Verwendung haben ausgeschlossen wären für die beabsichtigten statistischen Test. Aber was für meinen Code hält muss nicht unbedingt für Ihr halten.

Im Zweifelsfall könnten Sie natürlich statistisch analysiert die Ergebnisse der Anrufe an Random (beispielsweise in R, SPSS, etc.) und prüfen, ob die Verteilung der Ergebnisse, die verteilungs Anforderungen für Ihren speziellen statistischen Test (s) verstoßen. [Wenn du einen Wissenschaftler sind, dann ist es das, was Sie sollten auf jeden Fall tun.]

Should müssen Sie andere PRNGs - z.B. die TPMath Bibliothek enthält einige. (Für mehr beteiligt Dinge, gibt es auch die Möglichkeit, aufwendige statistische Funktionen von R über Delphi aufrufen.)

Andere Tipps

Delphi PRNG, wie fast alle Programmiersprache RTL PRNGs, ist ein Kongruenzgenerator .

Es ist gut genug für die meisten kleinen Dinge, aber es gibt Dinge zu achten gilt. Insbesondere achten Sie auf Bits niedriger Ordnung: das Muster der Multiplikation und fügen Sie bedeutet, dass Bits niedriger Ordnung überhaupt nicht sehr zufällig sind. Aber dies gilt in der Regel nur für große 32-Bit-Werte herausgezogen und dann abgeschnitten mit mod oder ähnlichem. Mit Random(10) Wert zupfen zwischen 0 und 9 intern einer Multiplikation über den gesamten 32-Bit-Bereich verwendet anstelle einem mod Betrieb.

alt text

Ich konnte nicht widerstehen.

Wenn Sie eine Art und Weise zu garantieren Einzigartigkeit von Zufallszahlen mit der schnellsten Ausführungszeit suchen, About.com hat eine Herausforderung geschaffen auf Schnellste Einzigartige Random Number Generator und Patrick van Logchem Implementierung wurde als der gewählte Sieger.

Wenn Sie eine relativ esoterische Hardware kaufen, die beste Annäherung an Zufallszahlen ein Computer zur Verfügung stellen kann, ist eine vollständig deterministische Pseudo-Zufallsfolge. Im Allgemeinen verwendet die Randomize-Funktion einig relativ zufälligen Wert (oft auf der Grundlage der Zeit, aber manchmal auf Mausbewegungen - ich habe keine Ahnung, was Delphi tut) als Samen, die den Einstieg in der Pseudo-Zufallsfolge liefert. Ohne diesen, werden Sie den gleichen Satz von Zufallszahlen in der gleichen Reihenfolge jedes Mal immer wieder am Ende, die den Zweck der Verwendung von Zufallszahlen in erster Linie zu besiegen tendiert.

Okay, ich weiß, dass dies nicht die Frage über die Zuverlässigkeit nicht beantworten, aber es solle Ihnen etwas Vertrauen geben, dass Sie benötigt randomize zu nennen, ist ein Zeichen für einen guten Generator anstatt einem schlecht. Es gibt eine Reihe von statistischen Tests, die zeigen, wie zufällig eine Folge von Zahlen, und es ist wahrscheinlich, dass der Delphi-Zufallszahlengenerator für viele Zwecke geeignet ist, da es ein ausgereiftes Produkt ist.

Just zu dem Pool der Möglichkeiten hinzuzufügen - Fenster bieten eine breite Palette von integrierten in Kryptografie-Funktionen . Es ist wahrscheinlich ein Delphi-Wrapper für sie auch, wenn sie standardmäßig enthält nicht bereits.

Unter diesen Funktionen ist auch ein kryptographisch starker Zufall Zahlengenerator . Dies ist bei weitem die beste Zufälligkeit Sie in der Software bekommen, weil sie Samen selbst auf einer sehr langen Liste von Faktoren. Ich bin nicht sicher, aber ich vermute, es wird sogar einen Hardware-Zufallszahlengenerator verwenden, wenn Sie eine haben.

Und wenn das nicht reicht, können Sie auch versuchen, auf der Quantum Random registrieren Bit-Generator-Service einige wirklich Zufallswerte.

Von der Embarcadero-Website:

_lrand ist die lange Zufallszahlengenerator-Funktion. _rand verwendet einen multiplikative congruential Zufallszahlengenerator mit der Periode 2 ^ 64 aufeinanderfolgende Pseudo-Zufallszahl im Bereich von 0 bis 2 ^ 31 zurückzukehren - 1.

Der Generator durch den Aufruf von srand mit einem Argument-Wert von 1 neu initialisiert Es kann mit einer bestimmten Anzahl der Samen durch den Aufruf von srand auf einen neuen Startpunkt gesetzt werden.

Wenn sie, da ich es (Delphi 4 IIRC) analysiert nicht die Implementierung ändern, wird die Delphi PRNG wie folgt umgesetzt:

Randseed:=int32(Randseed*$08088405)+1
result:=Randseed*Range shr 32

(Pseudocode / nehmen die Multiplikationen sind auf beliebig große ganze Zahlen)

Zurück zufällig zwischen 0..9

StrToInt(copy(FloatToStr(Random),4,1))

Hinweis: Überprüfen Sie FloatToStr (Random) Länge vor der Nutzung oder Verwendung einer anderen Stelle aus dem Dezimalteil ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top