C++指定范圍生成隨機數


      最近找游戲服務端的工作,“隨機數” 生成的問題遇到過幾次,由於之前的工作一直沒用到隨機數,平常沒怎么留意,知道有函數可以生成,卻沒去記住過(平常比較懶,對於庫函數都沒記過,都是需要用到才去百度查,查了也沒研究透,看來太依賴百度和google也不是件好事!)。為了加深記憶,同時也方便以后查閱,決定還是方法記錄下來。廢話不多說,看招!

      rand()函數定義在stdlib.h里,百度百科里將它定義為“偽隨機數發生器“,函數的原型為int rand(void); ,通過它可以產生一個[0,RAND_MAX]集合內的隨數,RAND_MAX定義在stdlib.h里,值為0x7fff(32767)。rand()生成的是一個系統指定范圍的隨機數,要怎樣才可以得到一個指定范圍內的隨機數呢?我們可以通過求余的思想來實現。很簡單,代碼如下:

#include "stdafx.h"
#include <iostream>
#include <ctime>

#define Randmod(x) rand()%x
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    //隨機生成10個[0,10]的數
    for(int i = 0; i < 10; i++ )
    {
         cout << Randmod(11) << endl;
    }
    return 0;
}

      通過求余運算,就可以得到0~10的隨機數,非常方便。但是,不要高興得太早,細心的你會發現,運行以上代碼,每次生成的隨機數都是一樣的。oh,shit! 功虧一簣了,這不科學,每次運行程序生成的隨機數都一樣,並不符合我們的需求。

  不用擔心,解決這個問題也簡單。之所以每次運行程序都生成同樣的隨機數,是因為還沒有設置隨機數種子。rand()函數生成隨機數需要通過srand()函數設置一個隨機數種子。srand()和rand()配合使用產生偽隨機數序列。rand函數在產生隨機數前,需要系統提供的生成偽隨機數序列的種子,rand()根據這個種子的值產生一系列隨機數。如果系統提供的種子沒有變化,每次調用rand函數生成的偽隨機數序列都是一樣的。srand(unsigned seed)通過參數seed改變系統提供的種子值,從而可以使得每次調用rand函數生成的偽隨機數序列不同,從而實現真正意義上的“隨機”。通常可以利用系統時間來改變系統的種子值,即srand(time(NULL)),可以為rand函數提供不同的種子值,進而產生不同的隨機數序列。以上是百度百科里對srand的說明,還是看代碼。

#include "stdafx.h"
#include <iostream>
#include <ctime>

#define Randmod(x) rand()%x
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    //根據系統時間設置隨機數種子
    srand( (unsigned)time(NULL) );

    //隨機生成10個[0,10]的數
    for(int i = 0; i < 10; i++ )
    {
         cout << Randmod(11) << endl;
    }
    return 0;
}

  通過設置隨機數種子和求余運算,就可以得到自己想要的隨機數了。下面是幾個常用的隨機數生成器:

srand((unsigned)time(null));
(low,up) #define Random (rand()%(up-low+1)) + low - 1
[low,up) #define Random (rand()%(up-low)) + low
(low,up] #define Random (rand()%(up-low))+ low + 1
[low,up] #define Random (rand()%(up-low+1)) + low

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM