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

时间:2015-01-05 03:07:57

标签: 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

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

2 个答案:

答案 0 :(得分: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;
}

每次我运行它,我都会:

$ test.pl
8.78851122762175
7.95806622921617
4.80827281057042
5.25673258208322
4.59162474505394
9.45475794360377

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

删除srand 10行,程序每次都会生成不同的随机数序列。

根据Perldoc rand

  

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

它继续:

  

如果您想要随机整数而不是随机小数,请将int()应用于rand()返回的值。例如,int(rand(10))会返回09之间的随机整数。

因此,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 );

答案 1 :(得分:5)

  

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

没有。 srand设置随机数生成器的种子(如果您不知道自己在做什么,我建议您不要修改种子),它对范围无效。听起来你真的想要像

这样的东西
$int = 45 + rand(5);