隨機數:rand()

首先咱們要對rand&srand有個整體的見解:srand初始化隨機種子,rand產生隨機數,下面將詳細說明。dom

 

rand(產生隨機數)函數

 

表頭文件: #include<stdlib.h>this

 

定義函數 :int rand(void)spa

 

函數說明 :ci

 

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

 

返回值:it

 

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

 

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罷了

相關文章
相關標籤/搜索