Funktion srand() i Perl

I programmeringssproget Perl har en indbygget funktion srand().

Denne funktion bruges til at indstille eller få nummer rækkefølgen af numeriske værdier fra en funktion, som returnerer rand().

Oftest, funktion srand() anvendt i forsøgene, at hver run the test funktion rand() returnerer samme værdi.

Her er et eksempel kode:

▶ 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));

Resultatet af programmet er altid de samme 5 numre:

1
0
9
3
3

Programmet bruger int(rand(10)) for at få et tilfældigt tal mellem 0(inkl.) at 9(inklusiv).

I den kode, der er et opkald srand(16);. Dette opkald indstiller funktionen rand() skulle vende tilbage antallet af pseudo-tilfældig sekvens nummer 16. Derfor, hver kørsel af dette program fører til samme resultat. Hvis dette program ikke var at kalde funktionen srand(), så forskellige kørsler af programmet kan returnere forskellige værdier.

Argumenter

Funktion srand() kan anvendes uden nogen argumenter eller give hende præcis ét argument.

I tilfældet, hvis du passerer mere end ét argument, vil det fejl:

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

Funktionen ikke bruge variabel $_. Hvis der er behov for at bruge det, så det skal være udtrykkeligt overføres til funktionen srand($_);.

Den funktion, der forventer, at et nummer som parameter værdi. Hvis den funktion, der modtager, er ikke et tal hun fører ham til nummeret.

Funktionen sletter brøkdelen og tegn. srand(-2.9) er den samme som srand(2). Her er et eksempel kode, der viser dette:

▶ 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);
}

Return værdi

Start med Perl 5.14 en funktion srand() altid vender tilbage til et nummer fra 1 til 4294967296, eller en streng 0 but true. Dette nummer er det nummer sekvens, der anvendes i funktionen rand().

Hvis funktionen srand() - opkald uden argumenter, det returnerer antallet den sekvens, der blev installeret automatisk.

Hvis funktionen opkald med et argument om, at det vil vende tilbage værdien af sekvensnummer, der blev installeret fra dette argument:

▶ Run
#!/usr/bin/perl

use feature qw(say);

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

Det er interessant, at for den sekvens nummer 0 funktion, der returnerer en streng, 0 but true:

▶ Run
#!/usr/bin/perl

print srand(0);

Før Perl 5.14, funktion srand() returnerer altid antallet 1.

Officiel dokumentation

Her er outputtet af kommandoen 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.

Relaterede emner

Andre artikler