轉自: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.
當我們需要一個特定區間內的隨機整數時,很多書上介紹的方法是:
- 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高兩倍。
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
0 | 1 | 2 | 3 | 4 | 5 | 0 | 1 | 2 |
我的做法是:
- int getRand(int max)
- {
- int i = rand();
- double f = (double)i / (double)(RAND_MAX+1);
- return (int)(f*(double)max);
- }
這個函數會產生[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 留作筆記