Während kein Computer wirklich zufällige Zahlen generieren kann, bietet Ruby Zugriff auf eine Methode, die zurückgibt pseudozufällig Zahlen.
Kein Computer kann wirklich generieren zufällige Zahlen rein rechnerisch. Das Beste, was sie tun können, ist zu generieren pseudozufällig Zahlen, die eine Folge von Zahlen sind, die erscheinen zufällig aber nicht.
Für einen menschlichen Beobachter sind diese Zahlen tatsächlich zufällig. Es wird keine kurzen sich wiederholenden Sequenzen geben, und zumindest für den menschlichen Beobachter werden sie kein klares Muster aufweisen. Bei genügend Zeit und Motivation jedoch das Original Samen kann entdeckt, die Sequenz neu erstellt und die nächste Nummer in der Sequenz erraten werden.
Aus diesem Grund sollten die in diesem Artikel beschriebenen Methoden wahrscheinlich nicht zum Generieren von Zahlen verwendet werden, die kryptografisch sicher sein müssen.
Pseudozufallszahlengeneratoren müssen sein ausgesät um Sequenzen zu erzeugen, die sich jedes Mal unterscheiden, wenn eine neue Zufallszahl erzeugt wird. Keine Methode ist magisch - diese scheinbar zufälligen Zahlen werden mit relativ einfachen Algorithmen und relativ einfacher Arithmetik erzeugt. Indem Sie das PRNG säen, starten Sie es jedes Mal an einem anderen Punkt. Wenn Sie es nicht säen, wird jedes Mal dieselbe Zahlenfolge generiert.
In Ruby ist die Kernel # srand Methode kann ohne Argumente aufgerufen werden. Es wird ein Zufallszahlen-Seed basierend auf der Zeit, der Prozess-ID und einer Sequenznummer ausgewählt. Einfach telefonisch srand An jeder Stelle zu Beginn Ihres Programms wird bei jeder Ausführung eine andere Reihe von scheinbar zufälligen Zahlen generiert. Diese Methode wird implizit beim Start des Programms aufgerufen und gibt dem PRNG die Zeit- und Prozess-ID (keine Sequenznummer).
Sobald das Programm läuft und Kernel # srand wurde entweder implizit oder explizit genannt, die Kernel # rand Methode kann aufgerufen werden. Diese Methode, die ohne Argumente aufgerufen wird, gibt eine Zufallszahl von 0 bis 1 zurück. In der Vergangenheit wurde diese Anzahl normalerweise auf die maximale Anzahl skaliert, die Sie generieren möchten, und möglicherweise to_i forderte es auf, es in eine ganze Zahl umzuwandeln.
Ruby macht die Sache jedoch etwas einfacher, wenn Sie Ruby 1.9.x verwenden. Das Kernel # rand Methode kann ein einzelnes Argument annehmen. Wenn dieses Argument a ist Numerisch Ruby generiert eine Ganzzahl von 0 bis (und ohne diese Zahl).
Was ist jedoch, wenn Sie eine Zahl zwischen 10 und 15 generieren möchten? Normalerweise generieren Sie eine Zahl von 0 bis 5 und addieren sie zu 10. Ruby macht es jedoch einfacher.
Achten Sie auf die beiden Arten von Bereichen. Wenn Sie angerufen haben Rand (10..15), das würde eine Zahl von 10 bis 15 erzeugen einschließlich 15. Wohingegen Rand (10... 15) (mit 3 Punkten) würde eine Zahl von 10 bis 15 erzeugen Nicht beinhaltet 15.
Manchmal benötigen Sie eine zufällig aussehende Folge von Zahlen, müssen jedoch jedes Mal dieselbe Folge generieren. Wenn Sie beispielsweise in einem Komponententest Zufallszahlen generieren, sollten Sie jedes Mal dieselbe Zahlenfolge generieren.
Ein Komponententest, der bei einer Sequenz fehlschlägt, sollte beim nächsten Ausführen erneut fehlschlagen. Wenn beim nächsten Mal eine Differenzsequenz generiert wird, schlägt er möglicherweise nicht fehl. Rufen Sie dazu an Kernel # srand mit einem bekannten und konstanten Wert.
Die Implementierung von Kernel # rand ist eher un-Ruby. Das PRNG wird in keiner Weise abstrahiert, und Sie können das PRNG auch nicht instanziieren. Es gibt einen globalen Status für das PRNG, den alle Codes gemeinsam nutzen. Wenn Sie den Startwert ändern oder auf andere Weise den Status des PRNG ändern, hat dies möglicherweise einen größeren Wirkungsbereich als erwartet.
Da Programme jedoch erwarten, dass das Ergebnis dieser Methode zufällig ist, ist dies der Zweck! - Das wird wahrscheinlich nie ein Problem sein. Nur wenn das Programm eine erwartete Folge von Zahlen erwartet, z. B. wenn es aufgerufen hat srand mit einem konstanten Wert, sollte es unerwartete Ergebnisse sehen.