2015-01-05 28 views
4

我想在Perl中使用srand函數,但似乎它不設置種子值每往往srand函數在Perl不給正確的範圍值

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

[[email protected] cookbook]# perl p2.7.pl 
random integer is 17.8465963028886 

應該不是隨機數是45之間的事情和50?

+0

爲了爲_format_代碼,縮進它四個空格。該代碼也基於標籤突出顯示。 –

+0

粘貼後也可以突出顯示代碼,然後按ctrl-k。 –

回答

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

'(45..50)[rand 6]'也可以工作,並且類似於Perl6構造體'(45..50).roll'('.pick'也適用於這種情況)。在這種情況下,我會建議在Perl5中使用它,因爲它使用更多的內存,速度可能會更慢,但如果您從非連續範圍(如'('A',2..10,'J ','Q','K')[rand 13]' –

5

不應該隨機數是45和50之間的東西嗎?

srand將隨機數生成器的種子(我建議你不要修改種子,如果你不知道你在做什麼),它什麼也不做的範圍。這聽起來像你真的想要像

$int = 45 + rand(5);