Funktion srand() in Perl

In der Programmiersprache Perl gibt es die eingebaute Funktion srand().

Diese Funktion dient zur Einstellung oder für weitere Zimmer Reihenfolge Zahlenwerte aus dem Rückgabewert die Funktion rand().

Meistens ist die Funktion srand() in den Tests verwendet, um bei jedem starten der Test-Funktion rand() zurückgegeben dieselben Werte.

Hier ist der Beispielcode:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;
use feature qw(say);

srand(16);

say int(rand(10));
say int(rand(10));
say int(rand(10));
say int(rand(10));
say int(rand(10));

Das Ergebnis des Programms ist immer die gleichen 5 Ziffern:

1
0
9
3
3

Das Programm verwendet int(rand(10)) , um eine Zufallszahl von 0(einschließlich), bis 9(inklusive).

Im Code gibt es eine Herausforderung srand(16);. Dieser Aufruf legt, dass die Funktion rand() zurückgeben soll Anzahl der Pseudo-Zufallsmuster sequence number 16. Also jeder Start dieses Programms führt zu dem gleichen Ergebnis. Wenn in diesem Programm war nicht Funktionsaufruf srand(), dann verschiedene Starts des Programms können unterschiedliche Werte zurückgeben.

Argumente

Die Funktion srand() können Sie ohne Argumente oder geben Ihr genau ein argument.

In dem Fall übergeben, wenn mehr als ein argument, dann wird der Fehler:

Too many arguments for srand at script.pl line 3, near "2)"
Execution of script.pl aborted due to compilation errors.

Funktion nicht verwendet Variable $_. Wenn es eine Notwendigkeit, es zu benutzen, müssen Sie explizit an die Funktion übergeben srand($_);.

Die Funktion erwartet eine Zahl als argument. Wenn die Funktion bekommt keine Zahl, es führt ihn auf eine Zahl.

Funktion verwirft Dezimalteil und Zeichen. srand(-2.9) ist das gleiche wie srand(2). Das folgende Beispiel es zeigt:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

foreach my $n (-2, 2, 2.1, 2.9, -2.1, -2.9) {
    my $real_n = srand($n);
    my @arr;
    foreach (1..5) {
        push @arr, int(rand(10));
    }
    printf "%4s  %s  (%s)\n", $n, $real_n, join(', ', @arr);
}

Der Rückgabewert

Seit Version 5.14 Funktion srand() gibt immer die Anzahl von 1 bis 4294967296oder Zeile 0 but true. Diese Zahl ist die Nummer der Sequenz, die in der Funktion verwendet rand().

Wenn die Funktion srand() ohne Argumente aufrufen, das Zimmer zurückgegeben Sequenzen, die automatisch installiert wurde.

Wenn die Funktion mit dem argument aufrufen, dann wird der Wert zurückgegeben, der Sequenznummer, die aus dieser Argumentation:

▶ Run
#!/usr/bin/perl

use feature qw(say);

say srand(1573); # 1573
say srand(-2.9); # 2

Ich Frage mich, was für eine Sequenz mit der Nummer 0 - Funktion gibt einen String zurück 0 but true:

▶ Run
#!/usr/bin/perl

print srand(0);

Bis zur Version 5.14 Funktion srand() immer eine Zahl zurückgegeben 1.

Die offizielle Dokumentation

Hier ist die Ausgabe des Befehls perldoc -f srand:

    srand EXPR
    srand   Sets and returns the random number seed for the "rand" operator.

            The point of the function is to "seed" the "rand" function so
            that "rand" can produce a different sequence each time you run
            your program. When called with a parameter, "srand" uses that
            for the seed; otherwise it (semi-)randomly chooses a seed. In
            either case, starting with Perl 5.14, it returns the seed. To
            signal that your code will work *only* on Perls of a recent
            vintage:

                use 5.014;  # so srand returns the seed

            If "srand" is not called explicitly, it is called implicitly
            without a parameter at the first use of the "rand" operator.
            However, there are a few situations where programs are likely to
            want to call "srand". One is for generating predictable results,
            generally for testing or debugging. There, you use
            "srand($seed)", with the same $seed each time. Another case is
            that you may want to call "srand" after a "fork" to avoid child
            processes sharing the same seed value as the parent (and
            consequently each other).

            Do not call "srand()" (i.e., without an argument) more than once
            per process. The internal state of the random number generator
            should contain more entropy than can be provided by any seed, so
            calling "srand" again actually *loses* randomness.

            Most implementations of "srand" take an integer and will
            silently truncate decimal numbers. This means "srand(42)" will
            usually produce the same results as "srand(42.1)". To be safe,
            always pass "srand" an integer.

            A typical use of the returned seed is for a test program which
            has too many combinations to test comprehensively in the time
            available to it each run. It can test a random subset each time,
            and should there be a failure, log the seed used for that run so
            that it can later be used to reproduce the same results.

            "rand" is not cryptographically secure. You should not rely on
            it in security-sensitive situations. As of this writing, a
            number of third-party CPAN modules offer random number
            generators intended by their authors to be cryptographically
            secure, including: Data::Entropy, Crypt::Random,
            Math::Random::Secure, and Math::TrulyRandom.

Verwandte Themen

Andere Artikel