1. 程式人生 > >用c語言產生隨機數的方法

用c語言產生隨機數的方法

c語言產生隨機數 定義函數 rand 正態分布 time pri 行程 程序 現在

用c語言產生隨機數的方法

一、

//************************************

偽隨機數

在C語言中,rand()函數可以用來產生隨機數,但是這不是真正意義上的隨機數,是一個偽隨機數,是根據一個數,我們可以稱它為種子,為基準以某個遞推公式推算出來的一系數,當這系列數很大的時候,就符合正態分布,從而相當於產生了隨機數,但這不是真正的隨機數。

rand(產生隨機數)
表頭 #include<stdlib.h>
定義函數 int rand(void)
函數說明
rand()會返回一隨機數值,範圍在0至RAND_MAX 間。在調用此函數產生隨機數前,必須先利用srand()設好隨機數種子,如果未設隨機數種子,rand()在調用時會自動設隨機數種子為1。
返回值
返回0至RAND_MAX之間的隨機數值,RAND_MAX定義在stdlib.h,其值為2147483647。


#include<stdio.h>
#include<stdlib.h>


int main(void)
{
for(int i=0;i<10;i++)
{
printf("%d\n",rand());
}
return 0;
}

可能大家都知道C語言中的隨機函數random,可是random函數並不是ANSIC標準,所以說,random函數不能在gcc,vc等編譯器下編譯通過。
//************************************

產生不可預見隨機數
利用srand((unsigned int)(time(NULL))是一種方法,因為每一次運行程序的時間是不同的。
在C語言裏所提供的隨機數發生器的用法:現在的C編譯器都提供了一個基於ANSI標準的偽隨機數發生器函數,用來生成隨機數。它們就是rand()和srand()函數。這兩個函數的工作過程如下:
1) 首先給srand()提供一個種子,它是一個unsigned int類型,其取值範圍從0~65535;
2) 然後調用rand(),它會根據提供給srand()的種子值返回一個隨機數(在0到32767之間)
3) 根據需要多次調用rand(),從而不間斷地得到新的隨機數;
4) 無論什麽時候,都可以給srand()提供一個新的種子,從而進一步“隨機化”rand()的輸出結果。
srand()用來設置rand()產生隨機數時的隨機數種子。在調用rand()函數產生隨機數前,必須先利用srand()設好隨機數種子(seed), 如果未設隨機數種子, rand()在調用時會自動設隨機數種子為1。
上面的例子就是因為沒有設置隨機數種子,每次隨機數種子都自動設成相同值1 ,進而導致rand()所產生的隨機數值都一樣。

srand()函數:
rand(設置隨機數種子)
表頭文件 #include<stdlib.h>
定義函數 void srand (unsigned int seed);
函數說明
srand()用來設置rand()產生隨機數時的隨機數種子。參數seed必須是個整數,通常可以利用geypid()或time(0)的返回值來當做seed。如果每次seed都設相同值,rand()所產生的隨機數值每次就會一樣。

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int main(void)

{
srand(time(0)); //time(0)/time(NULL)返回系統當前時間
for(int i=0;i<10;i++)
{
printf("%d\n",rand());
}
return 0;
}

//************************************
獲取不同要求的隨機數

1)、獲取在一定範圍內的數的話,直接做相應的除法取余即可
由於rand產生的隨機數從0到rand_max,而rand_max是一個很大的數,那麽如何產生從X~Y的數呢?
只要這樣寫:
rand()%(Y-X+1)+X;
這樣可以產生任何範圍內的隨機數。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int main(void)

{
srand(time(0));
for(int i=0;i<10;i++)
{ //產生10以內的整數
printf("%d\n",rand()%10);
}
return 0;
}
2)、獲取小數呢?例如:我們可以先獲得10001以內的整數(0~10000),然後再用這個整數除以10000得到小數點後兩位的小數。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int main(void)

{
srand(time(0));
for(int i=0;i<10;i++)
{
printf("%f\n",(rand()%10001)/10000.0);
}
return 0;
}

//************************************

二、3個通用的隨機數發生器,推薦用第3個
函數名: rand ()
功能: 隨機數發生器
用法: void rand(void);

函數名: random()
功能: 隨機數發生器
用法: int random(int num);
返回一個0~num-1之間的隨機數. random(num)是在stdlib.h中的一個宏定義. num和函數返回值都是整型數.
程序例:

#include <stdlib.h>
#include <stdio.h>
#include <time.h>

/* prints a random number in the range 0 to 99 */
int main(void)
{
  randomize();
  printf("Random number in the 0-99 range: %d\n", random (100));
  return 0;
}

函數名: randomize()
原型: int randomize(void)
功能: 通過time函數來得到一個隨機數
頭文件: stdlib.h time.h
該函數就相當於srand((unsign)(time(NULL)) 不過應註意的是randomize()的功能要通過time來實現所以在
調用它時頭文件要包含time.h。

程序例:

#include <stdlib.h>
#include <stdio.h>
#include <time.h>

int main(void)
{
  int i;

  randomize();
  printf("Ten random numbers from 0 to 99\n\n");
  for(i=0; i<10; i++)
    printf("%d\n", rand() % 100);
  return 0;
}

用c語言產生隨機數的方法