perl中的srand函数没有给出正确的值范围

use*_*215 4 perl

我试图在perl中使用srand函数,但似乎它不经常设置种子值

#!/usr/bin/perl
srand(45);
$int = rand(50);
print "random integer is $int\n";

[root@localhost cookbook]# perl p2.7.pl 
random integer is 17.8465963028886
Run Code Online (Sandbox Code Playgroud)

随机数不应该在45到50之间吗?

Dav*_* W. 7

函数srand 种子的随机数发生器.大多数编程语言中的随机数并非真正随机,但对于大多数用途来说这是可以的.设置种子将允许随机数序列反复重复.来自Perldoc:

[T]这里有一些程序可能想要打电话的情况srand.一种是产生可预测的结果,通常用于测试或调试.在那里,你每次都使用srand($seed)相同的$seed.

这是一个示例程序:

#! /usr/bin/env perl
#
use strict;             # Lets you know when you misspell variable names
use warnings;           # Warns of issues (using undefined variables

use feature qw(say);

srand 10;
for my $count ( (1..6) ) {
    say rand 10;
}
Run Code Online (Sandbox Code Playgroud)

每次我运行它,我得到:

$ test.pl
8.78851122762175
7.95806622921617
4.80827281057042
5.25673258208322
4.59162474505394
9.45475794360377
Run Code Online (Sandbox Code Playgroud)

一遍又一遍.那是因为我每次都使用相同的种子,允许随机数函数反复重复.这在测试中很有用.

摆脱那条srand 10线,程序每次都会产生不同的随机数序列.

根据Perldoc rand的说法:

返回一个大于或等于0且小于EXPR值的随机小数,[给定的参数].EXPR应该是积极的.

它继续:

如果您想要随机整数而不是随机小数int(),rand()则应用于返回的值.例如,int(rand(10))返回介于0和之间的随机整数9.

因此,rand 50返回0到50之间的值(但不是50).说,int( rand 50 )将返回0到49之间的整数.如果我想要一个介于45和50之间的数字,我将首先要确定50是否应该是我想要的数字之一.如果是,我需要六个数字的范围(45,46,47,48,49,50).因此,我想用来int( rand 6 )给我一个0到5之间的整数.然后我想添加45来给我一个45的范围给我一个45到50的范围:

say 45 + int( rand 6 );
Run Code Online (Sandbox Code Playgroud)


Ell*_*sch 5

随机数不应该在45到50之间吗?

编号srand设置随机数生成器的种子(如果你不知道你在做什么,我建议你不要修改种子),它对范围没有任何作用.听起来你真的想要类似的东西

$int = 45 + rand(5);
Run Code Online (Sandbox Code Playgroud)