Fonction srand() en Perl

Dans le langage de programmation Perl, il ya une fonction intégrée srand().

Cette fonction est utilisée pour l'installation ou pour obtenir le numéro de séquence de valeurs numériques à partir de laquelle renvoie la fonction de rand().

Le plus souvent la fonction srand() est utilisée dans les tests, pour chaque démarrage de la fonction de test rand() a les mêmes valeurs.

Voici un exemple de code:

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

Le résultat du programme est toujours les mêmes 5 chiffres:

1
0
9
3
3

Le programme utilise int(rand(10)) afin d'obtenir un nombre aléatoire de 0(inclus), jusqu'à 9(inclus).

Dans le code de l'appel srand(16);. Cet appel établit que la fonction rand() doit retourner un nombre pseudo-aléatoire de numéro de séquence 16. Par conséquent, chaque lancement de ce programme conduit le même résultat. Si ce programme n'était pas l'appel de la fonction srand(), ce les différents lancements de programmes peuvent renvoyer des valeurs différentes.

Les arguments

La fonction srand() , vous pouvez utiliser sans arguments, ou de lui transmettre exactement un argument.

Dans ce cas, si lui transmettre plus d'un argument, ce serait une erreur:

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

La fonction n'utilise pas la variable $_. Si vous avez besoin de l'utiliser, il faut clairement passer à la fonction srand($_);.

La fonction s'attend à recevoir un nombre comme la valeur de l'argument. Si la fonction ne reçoit pas un nombre elle conduit à un nombre.

La fonction renvoie la partie entière et la marque. srand(-2.9) — c'est la même chose que srand(2). Voici un exemple de code qui montre ça:

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

La valeur de retour

À partir de la version de Perl 5.14 fonction srand() renvoie toujours à un nombre de 1 à 4294967296, ou une chaîne de 0 but true. Ce nombre est le numéro de la séquence, qui est utilisé dans la fonction rand().

Si la fonction srand() appeler sans arguments, il renvoie à un numéro de une séquence qui a été installé automatiquement.

Si la fonction à appeler l'argument, elle renvoie la valeur du numéro de séquence, qui a été installé à partir de cet argument:

▶ Run
#!/usr/bin/perl

use feature qw(say);

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

Il est intéressant que pour la séquence avec le numéro de 0 , la fonction renvoie une chaîne de 0 but true:

▶ Run
#!/usr/bin/perl

print srand(0);

Jusqu'à la version de Perl 5.14 fonction srand() retourne le nombre de 1.

La documentation officielle

Voici la sortie de la commande 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.

Thèmes connexes

Autres articles