2011-03-21 78 views
2

rand函數產生的值如何取決於它的種子值。當我們沒有定義任何種子時,它的值如何不同。 下面是我發現生成號碼整數數組任何一個可以請解釋代碼:rand中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"; 

回答

4

據我所知,perl使用標準C庫的僞隨機數生成函數。
它可能取決於實施,但通常是Linear Congruential Generator。這種類型的PRNG使用它的先前值來生成下一個值,因此它需要一個開始值aka種子。

7

你並不需要顯式調用函數srand;如果你之前沒有調用過srand,那麼在你第一次調用rand時會隱含地爲你完成。

沒有參數的srand會嘗試將隨機數發生器初始化爲err隨機狀態。它使用/ dev/urandom或類似的東西(如果可用的話),否則回退到從當前時間和pid計算出的值。

rand()不帶參數返回0(含)和1(不含)之間的浮點值。將其乘以某個整數,即可得到> = 0和<這個整數的浮點值。在整數上下文中使用它(例如'%d'格式值)會給你一個從0到小於你的乘數的整數。 rand(x),對於非0的x,返回x * rand()可能具有的相同範圍的隨機數。因此rand(1)相當於rand(),而rand(1) * $MAXINT可能剛好是rand($MAXINT)

+1

提及rand(1)的用法是什麼,它的值如何隨着MAXINT相乘而變化。 – 2011-03-21 07:08:15

+0

我正在運行相同的程序,在$ NUM和$ MAXINT中稍作修改。我使用$ NUM作爲2和$ MAXINT作爲4.所以我只需要2個(在$ NUM中指定)隨機值。當我運行這個程序時,有時我會得到相同的隨機值。我如何確保始終獲得獨特的價值? – rpg 2011-06-16 08:10:25

+0

@ user502937:'my $ MAXINT = 5;我的$ NUM = 4;我的@array;我看到的%; for(1.. $ NUM){my $ rand = int rand $ MAXINT; $看過{$ rand} ++和重做; push @array,$ rand} print「(」,join(「,」,@array),「)\ n \ n」;' – ysth 2011-06-16 08:23:01

0

使用選定的種子進行初始化的值是,您將得到相同的僞隨機數。通過這種方式,您可以保持一些基於隨機的計算的可重複性,例如。不同的算法在固定集上的表現如何。