Chức năng srand() trong Perl

Perl ngôn ngữ đã được tích hợp trong chức năng srand().

Chức năng này được sử dụng để thiết lập hoặc có được số trình tự của các giá trị số từ một chức năng đó trở về rand().

Thông thường, các chức năng của srand() sử dụng các bài kiểm tra vào mỗi chạy các bài kiểm tra chức năng rand() trở về cùng một giá trị.

Đây là một ví dụ mã:

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

Các kết quả của chương trình này là luôn luôn cùng một con số 5:

1
0
9
3
3

Chương trình sử dụng int(rand(10)) để nhận được một số ngẫu nhiên giữa 0(bao gồm) để 9(bao gồm).

Trong những mã đó là một cuộc gọi srand(16);. Cuộc gọi này, bộ các chức năng rand() nên trở về những số ngẫu nhiên, dãy số 16. Vì vậy, mỗi chạy chương trình này dẫn đến cùng một kết quả. Nếu chương trình này không được kêu gọi các chức năng srand(), sau đó chạy khác nhau của chương trình có thể trở lại giá trị khác nhau.

Lập luận

Chức năng srand() có thể được sử dụng mà không có bất kỳ lý luận hay cho cô ấy chính xác một cuộc tranh luận.

Trong trường hợp nếu cậu vượt qua nhiều hơn một cuộc tranh luận, nó sẽ lỗi:

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

Các chức năng không sử dụng biến $_. Nếu đó là một sự cần thiết để sử dụng nó, sau đó nó phải được rõ ràng được truyền cho các chức năng srand($_);.

Các chức năng hy vọng một số như lập luận giá trị. Nếu các chức năng nhận được không phải là một số cô ấy dẫn anh ta đến số.

Chức năng huỷ phần phân đoạn và các dấu hiệu. srand(-2.9) là giống như srand(2). Đây là một ví dụ mã đó cho thấy điều này:

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

Trở lại giá trị

Bắt đầu với Perl 5.14 một chức năng srand() luôn luôn trở về một con số từ 1 đến 4294967296, hoặc một chuỗi 0 but true. Này số là số thứ tự được sử dụng trong những chức năng rand().

Nếu các chức năng srand() cuộc gọi, không có lý luận, nó trở về các con số trình tự tự động cài đặt.

Nếu các chức năng gọi với một cuộc tranh luận, nó sẽ trở lại giá trị của những dãy số, điều đó đã được cài đặt từ cuộc tranh luận này:

▶ Run
#!/usr/bin/perl

use feature qw(say);

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

Nó là thú vị đó cho các dãy số 0 trở về chức năng một chuỗi 0 but true:

▶ Run
#!/usr/bin/perl

print srand(0);

Trước khi Perl 5.14, các chức năng srand() luôn luôn trở về số 1.

Tài liệu chính thức

Đây là kết quả của sự chỉ huy 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.

Chủ đề liên quan

Các bài viết khác