CCRANDOM_0_1()其實不那麼好用 愛上C++隨機數的緣由

//rand()實際並不是一個真正的僞隨機數發生器,random()會相對好點,但也不算理想。幸運的是iPhone上還有其他的選擇。
    //arc4random() 是個不錯的選擇,原因就是它是一個真正的僞隨機算法,而且範圍是rand()的兩倍。
    /*
    在iPhone中,RAND_MAX是0x7fffffff (2147483647),而arc4random()返回的最大值則是 0x100000000 (4294967296),從而有更好的精度。此外,使用arc4random()還不需要生成隨機種子,因爲第一次調用的時候就會自動生成。
    */
    //通過arc4random() 獲取0到x-1之間的整數的代碼如下:
    //int value = arc4random() % x;
    //獲取1到x之間的整數的代碼如下:
    //int value arc4random() % x + 1;
    //最後如果想生成一個浮點數,可以在項目中定義如下宏:
    //#define ARC4RANDOM_MAX      0x100000000
    //然後就可以使用arc4random() 來獲取0到100之間浮點數了(精度是rand()的兩倍),代碼如下:
    //double val = floorf(((double)arc4random() / ARC4RANDOM_MAX) * 100.0f);
    
    //cocos2d-x裏面是這樣定義隨機數的
    //#define CCRANDOM_0_1() ((float)rand()/RAND_MAX)
    //#define	RAND_MAX	0x7fffffff(標準庫定義的額)
    
    
    log("ar4:%u",arc4random());//u_int32_t arc4random(void);
    /*
    函數一:int rand(void);
    返回一個[0,RAND_MAX]間的隨機整數。
    函數二:void srand(unsigned seed);
    參數seed是rand()的種子,用來初始化rand()的起始值。
    */
    //可以用以下兩種方式產生隨機種子
    srand((unsigned)time(0));
    srand((unsigned)time(NULL));
    rand();
    random();
    //time_t time(0):time_t被定義爲長整型,它返回從1970年1月1日零時零分零秒到目前爲止所經過的時間,單位爲秒。
    log("Long : %ld", time(0));


最近發現C++11提供了新的隨機數機制,感覺非常給力。

需要引入頭文件

#include <random>

/*
    新設施利用兩部分來生成隨機數:
    
    random number engines . 負責生成原始隨機數
    random number distributions . 迫使生成的隨機數在統計上滿足指定的概率分佈
     
    STL預先指定了一系列的生成引擎,並且提供一個 default_random_engine 。
    default_random_engine 會使用某個預定義的引擎,且不同編譯器,不同平臺的實現可能不同。
    */
    std::default_random_engine e;
    printf("the e() is %u", e());//產生隨機數
    
    /*
     默認情況下,引擎產生的隨機數範圍在 
     default_randm_engine::min 和 default_random_engine::max 之間。
     */
    printf("min:%u\n",std::default_random_engine::min());//1
    printf("max:%u\n",std::default_random_engine::max());//2147483646
    /*
     有了引擎,我們可以指定隨機數要符合的分佈性質,例如說,在([5,20])上的均勻分佈
     */
    std::uniform_int_distribution<> u(5,20);
    for (size_t i = 0; i < 10; i++) {
        std::cout << u(e) << std::endl;
    }
    
    /*
     上面那兩個函數生成的隨機數,在我測試的時候每次都是一樣的。不知道原因,但是感覺巨坑。可能從頭到尾都只給了一次種子吧。強烈推薦最後這種生成方法。
     C++11提供了一個非常友好的類: random_device 。
     這個類的作用是,可以產生 non-deterministic random numbers .
     
     這個類有可能產生真正的隨機數,不過真是效果和具體實現有關。
     某些平臺可能才用僞隨機數作爲底層實現也說不定呢…
     顯然的,我們可以利用 random_device 去初始化我們的隨機數種子
     
     */
    std::random_device rd;
    std::default_random_engine e_real(rd());
    std::uniform_int_distribution<> u_real(5,20);
    for (size_t i = 0; i < 10; i++) {
        std::cout << u_real(e_real) << std::endl;
    }






發佈了39 篇原創文章 · 獲贊 4 · 訪問量 26萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章