回覆列表
  • 1 # 小紅的甜心

    rand和srand的用法

    首先我們要對rand&srand有個總體的看法:srand初始化隨機種子,rand產生隨機數,下面將詳細說明。

    rand(產生隨機數)

    表頭檔案: #include<stdlib.h>

    定義函式 :int rand(void)

    函式說明 :

    因為rand的內部實現是用線性同餘法做的,他不是真的隨機數,只不過是因為其週期特別長,所以有一定的範圍裡可看成是隨機的,rand()會返回一隨機數值,範圍在0至RAND_MAX 間。在呼叫此函式產生隨機數前,必須先利用srand()設好隨機數種子,如果未設隨機數種子,rand()在呼叫時會自動設隨機數種子為1。rand ()產生的是假隨機數字,每次執行時是相同的。若要不同,以不同的值來初始化它.初始化的函式就是srand()。

    返回值:

    返回0至RAND_MAX之間的隨機整數值,RAND_MAX的範圍最少是在32767之間(int),即雙位元組(16位數)。若用unsigned int 雙位元組是65535,四位元組是4294967295的整數範圍。

    0~RAND_MAX每個數字被選中的機率是相同的。

    範例:

    /* 產生介於1 到10 間的隨機數值,此範例未設隨機數種子,完整的隨機數產生請參考

    srand()*/

    #include<stdlib.h>

    main()

    {

    int i,j;

    for(i=0;i<10;i++)

    {

    j=1+(int)(10.0*rand()/(RAND_MAX+1.0));

    printf("%d ",j);

    }

    }

    執行:

    9 4 8 8 10 2 4 8 3 6

    9 4 8 8 10 2 4 8 3 6 //再次執行仍然產生相同的隨機數

    srand(設定隨機數種子)

    表頭檔案:#include<stdlib.h>

    定義函式:void srand (unsigned int seed);

    函式說明:

    srand()用來設定rand()產生隨機數時的隨機數種子。引數seed必須是個整數,通常可以利用geypid()或time(0)的返回值來當做seed。如果每次seed都設相同值,rand()所產生的隨機數值每次就會一樣。

    範例

    /* 產生介於1 到10 間的隨機數值,此範例與執行結果可與rand()參照*/

    #include<time.h>

    #include<stdlib.h>

    main()

    {

    int i,j;

    srand((int)time(0));

    for(i=0;i<10;i++)

    {

    j=1+(int)(10.0*rand()/(RAND_MAX+1.0));

    printf(" %d ",j);

    }

    }

    執行:與rand範例比較

    5 8 8 8 10 2 10 8 9 9

    2 9 7 4 10 3 2 10 8 7

    又或:

    用"int x = rand() % 100;"來生成 0 到 100 之間的隨機數這種方法是不或取的,比較好的做法是: j=(int)(n*rand()/(RAND_MAX+1.0))產生一個0到n之間的隨機數

    int main(void)

    {

    int i;

    time_t t;

    srand((unsigned) time(&t));

    printf("Ten random numbers from 0 to 99\n\n");

    for(i=0; i<10; i++)

    printf("%d\n", rand() % 100);

    return 0;

    }

    除以上所說的之外,補充一點就是srand這個函式一定要放在迴圈外面或者是迴圈呼叫的外面,否則的話得到的是相同的數字。

    MSDN中的例子。

    // crt_rand.c

    // This program seeds the random-number generator

    // with the time, then displays 10 random integers.

    //

    #include <stdlib.h>

    #include <stdio.h>

    #include <time.h>

    int main( void )

    {

    int i;

    // Seed the random-number generator with current time so that

    // the numbers will be different every time we run.

    //

    srand( (unsigned)time( NULL ) );

    // Display 10 numbers.

    for( i = 0; i < 10;i++ )

    printf( " %6d\n", rand() );

    printf("\n");

    // Usually, you will want to generate a number in a specific range,

    // such as 0 to 100, like this:

    {

    int RANGE_MIN = 0;

    int RANGE_MAX = 100;

    for (i = 0; i < 10; i++ )

    {

    int rand100 = (((double) rand() /

    (double) RAND_MAX) * RANGE_MAX + RANGE_MIN);

    printf( " %6d\n", rand100);

    }

    }

    總結:

    我們知道rand()函式可以用來產生隨機數,但是這不是真真意義上的隨機數,是一個偽隨機數,是根據一個數,我們可以稱它為種了,為基準以某個遞推公式推算出來的一系數,當這系列數很大的時候,就符合正態公佈,從而相當於產生了隨機數,但這不是真正的隨機數,當計算機正常開機後,這個種子的值是定了的,除非你破壞了系統,為了改變這個種子的值,C提供了 srand()函式,它的原形是void srand( int a) 功能是

    初始化隨機產生器既rand()函式的初始值,即使把種子的值改成a; 從這你可以看到透過sand()函式,我們是可以產生可以預見的隨機序列,

    那我們如何才能產生不可預見的隨機序列呢?我們可能常常需要這樣的隨機序列,是吧。利用srand((unsign)(time(NULL))是一種方法,因為每一次執行程式的時間是不同的,對了,你知道time() 函式的功能是返回從1970/01/01到現在的秒數的吧,可能這個起始時間不正確,你查一下對不對吧,C還提供了另一個更方便的函式, randomize()

    原形是void randomize(),功能是用來始初rand() 的種子的初始值,而且該值是不確定的,它相當於srand((unsign)(time(NULL)) 不過應注意的是randomize()的功能要透過time來實現所以在呼叫它時標頭檔案要包含time.h罷了

  • 中秋節和大豐收的關聯?
  • 蘊含人生哲理的成語十個?