Bessere Zufallszahlen mit Ruby

Die meisten Pseudo-Zufallszahl-Generatoren arbeiten mit einem Seed, der auf der Systemzeit basiert. Oft reicht dies auch aus, wer aber sehr viele Zufallszahlen innert Millisekunden generieren muss (z.B. über Unit Tests), dem wird die Standard-Methode nicht ausreichen.Ich hatte kürzlich einen solchen Fall und habe dies mit folgendem Workaround gelöst:

Ruby Code

    require 'digest'

    seed = rand(100) + 1

    Digest::SHA2.hexdigest("#{Time.now.to_f}-#{othervar}").chars.each { |c|
      i = c.to_i rescue 0
      seed *= i unless i == 0
    }

    srand(seed)
    r = rand

Zuerst wird der Seed mit einer Zufallszahl initialisiert und erhöht, um den Wert 0 auszuschliessen.

Der nächste Block generiert einen SHA-2 und jede darin vorhandene Zahl (ausser 0 und a-f, abgesichert durch den rescue) wird mit dem aktuellen Seed Wert multipliziert. Hier könnte der Code noch optimiert werden, es reichte allerdings für meine Zwecke.

Zuletzt wird der Generator mit dem Seed gefüttert und die Pseudo-Zufallszahl erstellt.

Autor: Simon

IT Security Spezialist, in Zürich aufgewachsen, zweifacher Vater und speziell interessiert am interaktiven Web, Audio Engineering und Kino. Erfahre mehr über mich und folge mir auf Twitter: @-simwep

Schreib einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *