La función de srand() en Perl

En el lenguaje de programación Perl tiene integrada la función de srand().

Esta función se utiliza para la instalación o para obtener el número de la secuencia de valores numéricos de la que devuelve la función rand().

A menudo la función de srand() se utiliza en las pruebas, para que cada vez que se inicia la prueba de la función de rand() devolvía los mismos valores.

He aquí un ejemplo de código:

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

El resultado del trabajo de este programa son siempre los mismos 5 dígitos:

1
0
9
3
3

El programa utiliza int(rand(10)) para obtener un número aleatorio de 0(ambos inclusive), hasta 9(inclusive).

En el código de llamada srand(16);. Esta llamada establece que la función de rand() debe devolver el número de псевдослучайной el número de secuencia de 16. Por lo tanto, cada inicio de este programa, hace que al mismo resultado. Si en este programa no es la llamada a la función srand(), lo diferentes ejecuciones del programa pueden devolver valores diferentes.

Los argumentos

La función de srand() puede utilizarse sin argumentos, o de pasar exactamente un argumento.

En caso de pasar más de un argumento, lo que se producirá un error:

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

La función no se utiliza la variable $_. Si hay una necesidad de su uso, se debe distribuir de forma explícita en función de srand($_);.

La función de espera para obtener el número como en el valor del argumento. Si la función recibe no es un número, lo que le lleva a su número.

La función arroja la parte fraccionaria y la marca. srand(-2.9) es lo mismo que srand(2). He aquí un ejemplo de código que muestra esto:

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

El valor devuelto

A partir de la versión de Perl 5.14 función srand() siempre devuelve el número de 1 hasta 4294967296o la línea 0 but true. Este número es un número de secuencia que se utiliza en la función rand().

Si la función de srand() llamar sin argumentos, devuelve el número de la secuencia que se instala automáticamente.

Si la función de llamar con el argumento, devuelve el valor del número de secuencia, que se estableció de este argumento:

▶ Run
#!/usr/bin/perl

use feature qw(say);

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

Es interesante que para la secuencia con el número de 0 , la función devuelve una cadena 0 but true:

▶ Run
#!/usr/bin/perl

print srand(0);

Antes de la versión de Perl 5.14 función srand() siempre devuelve el número de 1.

La documentación oficial

He aquí el resultado 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.

Temas relacionados

Otros articulos