rand函數



轉自:https://blog.csdn.net/chikey/article/details/66970397

            https://blog.csdn.net/chikey/article/details/66970397 留作筆記用



一、rand()

rand()函數用來產生隨機數,但是,rand()的內部實現是用線性同餘法實現的,是僞隨機數,由於週期較長,因此在一定範圍內可以看成是隨機的。

rand()會返回一個範圍在0到RAND_MAX(32767)之間的僞隨機數(整數)。

在調用rand()函數之前,可以使用srand()函數設置隨機數種子,如果沒有設置隨機數種子,rand()函數在調用時,自動設計隨機數種子爲1。隨機種子相同,每次產生的隨機數也會相同。

rand()函數需要的頭文件是:<stdlib.h>

rand()函數原型:int rand(void);

使用rand()函數產生1-100以內的隨機整數:int number1 = rand() % 100;

二、srand()

srand()函數需要的頭文件仍然是:<stdlib.h>

srand()函數原型:void srand (usigned int seed);

srand()用來設置rand()產生隨機數時的隨機數種子。參數seed是整數,通常可以利用time(0)或geypid(0)的返回值作爲seed。

使用rand()和srand()產生1-100以內的隨機整數:srand(time(0));

    int number1 = rand() % 100;

三、使用rand()和srand()產生指定範圍內的隨機整數的方法

“模除+加法”的方法

因爲,對於任意數,0<=rand()%(n-m+1)<=n-m

因此,0+m<=rand()%(n-m+1)+m<=n-m+m

因此,如要產生[m,n]範圍內的隨機數num,可用:

int num=rand()%(n-m+1)+m;

其中的rand()%(n-m+1)+m算是一個公式,記錄一下方便以後查閱。

比如產生10~30的隨機整數:

srand(time(0));

int a = rand() % (21)+10;


C語言要獲得隨機數,就要用到rand()函數。關於rand函數要注意以下幾點:

1.要包含stdlib.h,rand函數聲明在這個函數裏。

2.rand()函數返回一個0~RAND_MAX之間的隨機數,經測試在VC,GCC中,[0,RAND_MAX],這個隨機數是可以是0或RAND_MAX的。

3.rand()產生的是僞隨機數,如果不初始化,每次輸出都是一樣的序列。

4.srand(seed)是初始化函數,seed一般用機器時間。


RAND_MAX是跟實現有關的,在VC6裏是32767,在GCC裏是2147483647。當然rand實現也不一樣。

調用一億次rand函數,VC6耗時約530ms,GCC耗時約1640ms.


當我們需要一個特定區間內的隨機整數時,很多書上介紹的方法是:

  1. x = rand()%(b-a+1) +a  

這樣確實能取得[a,b]區間內的整數,但每個數的概率不一定是一樣的。

假設RAND_MAX是8,rand返回0~8之間隨機數,如果取0~5之間的隨機數,rand返回0~8,0~5取餘後還是0~5,

6~8取餘後,產生0~2,所以0、1、2的概率就要比3、4、5高兩倍。

012345678
012345012

我的做法是:

  1. int getRand(int max)  
  2. {  
  3.     int i = rand();  
  4.     double f = (double)i / (double)(RAND_MAX+1);  
  5.     return (int)(f*(double)max);  
  6. }  

這個函數會產生[0,max)的隨機數,0~max-1出現的概率是均等的。
[a,b]區間的隨機數就是 a+getRand(b-a+1);

由於現在PC的浮點算法很快,這個算法比取餘慢不了多少。




轉自:https://blog.csdn.net/chikey/article/details/66970397

            https://blog.csdn.net/chikey/article/details/66970397 留作筆記

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章