//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;
}