rand函数产生的值如何取决于它的种子值。当我们没有定义任何种子时,它的值如何不同。 下面是我为生成整数数组的数字而找到的代码,请解释一下:
#!/usr/bin/perl -w
# Linear search of an array
# Note that if you later on want to search for something from a
# list of values, you shouldn’t have used an array in the first
# place.
# Generating 10 integers
$NUM = 10;
$MAXINT = 100; # 1 + the maximum integer generated
srand(); # initialize the randomize seed
print "Numbers Generated:\n(";
for $i (1 .. $NUM) {
push @array, sprintf("%d", rand(1) * $MAXINT);
print $array[$i-1];
print ", " unless ($i == $NUM);
}
print ")\n\n";
答案 0 :(得分:7)
您不需要显式调用srand;如果您之前没有调过srand,那么第一次调用rand时会为你隐式完成。
没有参数的srand将尝试将随机数生成器初始化为一个错误的随机状态。它使用/ dev / urandom等(如果可用),否则将返回根据当前时间和pid计算的值。
没有参数的rand()返回0(包括)和1(不包括)之间的浮点值。将其乘以某个整数,得到的浮点值来自> = 0和<那个整数。在整数上下文中使用它(例如'%d'格式值)会给出一个比乘数小0到1的整数。 rand(x)
,对于除0以外的x,返回x * rand()
所具有的相同范围的随机数。因此rand(1)
仅相当于rand()
,而rand(1) * $MAXINT
可能只是rand($MAXINT)
。
答案 1 :(得分:4)
据我所知,perl使用标准C库的伪随机数生成函数 它可能取决于实现,但通常是Linear Congruential Generator。这种PRNG使用它的先前值来生成下一个,因此它需要一个起始值,即种子。
答案 2 :(得分:0)
使用所选种子初始化的值是,您获得相同的伪随机数。通过这种方式,您可以保持一些基于随机的计算可重复,例如。不同的算法如何在固定集合上执行。