1. 程式人生 > >C++隨機數的產生

C++隨機數的產生

C++中我們經常會用到隨機數,而隨機數的生成我們通常會用到rand()和srand()函式,由於rand()的內部實現是用線性同餘法來做的,所以並不能生成真正的隨機數,而是在一定範圍內可看為隨機數的偽隨機數。

Rand()函式

但有rand()函式只會返回一個0到RAND_MAX之間的數字,RAND_MAX的值與int的位數有關。不過rand()是一次性的,因為系統預設的隨機種子為1,如果隨機種子不變的話,那麼產生的隨機數也會是同一個,這就需要用到我們的srand()函數了。

Srand()函式

srand()函式可以設定rand()函式產生隨機數時的隨機種子數,通過設定不同的種子,我們可以產生不同的隨機數,一般情況下,我們通常會用系用時間作為種子,一般寫作:srand((unsigned int)time(NULL)),因為這裡用到了time,所以要引入<ctime>的標頭檔案

#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
int main()
{
    srand((unsigned int)time(NULL));
    for(int i=0; i<5; i++)
    {
        cout<<rand()<<endl;
    }
    return 0;
}

下面總結幾個常用的公式:

求[0,x)之間的整數:rand()%x;

求[a,b)之間的整數:rand()%(b-a) + a;

求[a,b]之間的整數:rand()%(b-a) + a + 1;

求(0,1)之間的浮點數:rand()/double(RAND_MAX);

示例:

求[0,10)之間的整數

#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
int main()
{
    int x = 10;
    srand((unsigned int)time(NULL));
    for(int i=0; i<5; i++)
    {
        cout<<rand()%x<<endl;
    }
    return 0;
}

求[5,15]之間的整數

#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
int main()
{
    int a = 5,b = 15;
    srand((unsigned int)time(NULL));
    for(int i=0; i<5; i++)
    {
        cout<<rand()%(b - a) + a + 1<<endl;
    }
    return 0;
}

求(0,1)之間的浮點數

#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
int main()
{
    srand((unsigned int)time(NULL));
    for(int i=0; i<5; i++)
    {
        cout<<rand()/double(RAND_MAX)<<endl;
    }
    return 0;
}