Fungsi srand() di Perl

Dalam bahasa pemrograman Perl memiliki fungsi built-in srand().

Fungsi ini digunakan untuk mengatur atau mendapatkan nomor urutan dari nilai-nilai numerik dari sebuah fungsi yang mengembalikan rand().

Paling sering, fungsi srand() yang digunakan dalam tes untuk masing-masing menjalankan tes fungsi rand() kembali nilai yang sama.

Berikut adalah contoh 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));

Hasil dari program ini adalah selalu sama 5 nomor:

1
0
9
3
3

Program ini menggunakan int(rand(10)) untuk mendapatkan nomor acak antara 0(inklusif) untuk 9(inklusif).

Dalam kode ada panggilan srand(16);. Panggilan ini menetapkan fungsi rand() harus kembali jumlah pseudo-random nomor urut 16. Oleh karena itu, masing-masing menjalankan program ini mengarah untuk hasil yang sama. Jika program ini tidak memanggil fungsi srand(), maka berbeda menjalankan program dapat kembali nilai-nilai yang berbeda.

Argumen

Fungsi srand() dapat digunakan tanpa argumen atau memberikan tepat satu argumen.

Dalam kasus jika anda melewatkan lebih dari satu argumen, maka akan error:

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

Fungsi ini tidak menggunakan variabel $_. Jika ada kebutuhan untuk menggunakannya, maka ia harus secara eksplisit dilewatkan ke fungsi srand($_);.

Fungsi mengharapkan angka sebagai nilai argumen. Jika fungsi yang menerima bukan nomor dia memimpin dia ke nomor.

Fungsi membuang bagian pecahan dan tanda. srand(-2.9) adalah sama seperti srand(2). Berikut adalah contoh kode yang menunjukkan hal ini:

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

Nilai kembali

Dimulai dengan Perl 5.14 fungsi srand() selalu mengembalikan jumlah dari 1 untuk 4294967296, atau string 0 but true. Nomor ini adalah nomor urut yang digunakan dalam fungsi rand().

Jika fungsi srand() panggilan tanpa argumen, ia mengembalikan nomor urutan yang diinstal secara otomatis.

Jika pemanggilan fungsi dengan argumen ini akan mengembalikan nilai dari nomor urut, yang diinstal dari argumen ini:

▶ Run
#!/usr/bin/perl

use feature qw(say);

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

Sangat menarik bahwa untuk nomor urut 0 fungsi yang mengembalikan string 0 but true:

▶ Run
#!/usr/bin/perl

print srand(0);

Sebelum Perl 5.14, fungsi srand() selalu mengembalikan jumlah 1.

Dokumentasi resmi

Berikut ini adalah output dari perintah 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.

Topik terkait

Artikel lainnya