Funzione srand() in Perl

Nel linguaggio di programmazione Perl ci sono built-in funzione di srand().

Questa funzione viene utilizzata per l'installazione o per ottenere un numero sequenza di valori numerici di cui restituisce la funzione rand().

Spesso la funzione srand() utilizzato nei test, per ogni si esegue il test, la funzione rand() restituisce gli stessi valori.

Ecco un esempio di codice:

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

Il risultato è sempre le stesse 5 cifre:

1
0
9
3
3

Il programma utilizza int(rand(10)) per ottenere un numero casuale da 0(compreso), a 9(compreso).

Nel codice c'è una chiamata srand(16);. Questa sfida stabilisce che la funzione di rand() deve rimborsare i numeri di sequenza pseudo-casuale camera 16. Quindi ogni lancio di questo programma porta allo stesso risultato. Se in questo programma non c'era una chiamata di funzione srand(), poi diversi lanci i programmi possono restituire valori diversi.

Argomenti

La funzione srand() può essere utilizzato senza argomenti, o dirle esattamente un argomento.

Nel caso in cui darle più di un argomento, quello è un errore:

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

La funzione non utilizza una variabile $_. Se vi è la necessità di utilizzarlo, è necessario passare in modo esplicito in funzione srand($_);.

La funzione si aspetta di ricevere un numero come valore dell'argomento. Se la funzione riceve un numero ciò porta a un numero.

La funzione oscilla la parte frazionaria e segno. srand(-2.9) — e ' lo stesso che e srand(2). Ecco un esempio di codice che mostra:

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

Il valore restituito

A partire dalla versione di Perl 5.14 funzione srand() restituisce sempre un numero da 1 a 4294967296, oppure una stringa di 0 but true. Questo numero è il numero di sequenza, che viene utilizzato in funzione rand().

Se la funzione srand() chiamato senza argomenti, restituirà camera la sequenza, che è stato installato automaticamente.

Se la funzione da chiamare con l'argomento, restituirà il valore di un numero di sequenza, che è stato stabilito da questo argomento:

▶ Run
#!/usr/bin/perl

use feature qw(say);

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

Interessante che per la sequenza con il numero 0 la funzione restituisce una stringa 0 but true:

▶ Run
#!/usr/bin/perl

print srand(0);

Prima versione di Perl 5.14 funzione srand() restituisca il numero di 1.

La documentazione ufficiale di

Ecco l'output del comando 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.

Temi correlati

Altri articoli