大家都知道裡面的
rand
和srand()
函式吧?
他們其實是偽隨機數生成器,生成的隨機數有週期性,而且取決於隨機種子。
那麼如何生成真隨機數呢?下面我來講一下兩個系統下的生成方法。
這個winrandom
類呼叫了系統的加密秘鑰生成器,這個生成器呼叫核心生成秘鑰,所以是硬體的真隨機數。
#include #include class winrandom
~winrandom()
bool randbuf(void *dest, int len)
# define _(func, typ) \
typ func()
_(randint, int)
_(randlong, long long)
_(randunsigned, unsigned)
_(randunsignedlong, unsigned long long)
_(randshort, short)
_(randunsignedshort, unsigned short)
_(randchar, char)
_(randunsignedchar, unsigned char)
_(randsignedchar, signed char)
};
winrandom r;
printf("unsigned: %u\nlong long: %lld\n",
r.randunsigned(),
r.randlong());
就是這樣,還不用srand
,是不是很方便啊?很適合做資料生成器!
注意:請不要在比賽時使用!
注意:請不要在比賽時使用!
注意:請不要在比賽時使用!
要在比賽時使用請看下方【通用】
由於 linux 系統自帶了/dev/random
,所以請使用 stl。
#include int main()
這個在 windows 系統上也可以用,但是呼叫的就是srand
和rand
...
這個隨機數生成器在 windows 和 linux 上都可以工作,但是只有在 linux 上才是真隨機數。windows 上他生成的隨機數週期很大,可以視為真隨機。
#include int main()
C 隨機數生成方法
一 c 中不能使用random 函式 c 中常用rand 函式生成隨機數,但嚴格意義上來講生成的只是偽隨機數 pseudo random integral number 生成隨機數時需要我們指定乙個種子,如果在程式內迴圈,那麼下一次生成隨機數時呼叫上一次的結果作為種子。但如果分兩次執行程式,那麼由於...
C 隨機數的生成方法
一 c 中不能使用random 函式 c 中常用rand 函式生成隨機數,但嚴格意義上來講生成的只是偽隨機數 pseudo random integral number 生成隨機數時需要我們指定乙個種子,如果在程式內迴圈,那麼下一次生成隨機數時呼叫上一次的結果作為種子。但如果分兩次執行程式,那麼由於...
隨機數的生成方法(C)
在 c 語言中,rand 函式可以用來產生隨機數,但是這不是真真意義上的隨機數,是乙個偽隨機數,以乙個數 種子 為基準,利用遞推公式推算出來的一係數。當這系列數很大的時候,就符合正態公布,從而相當於產生了隨機數,但這不是真正的隨機數。當計算機正常開機後,這個種子的值是定了的。為了改變這個種子的值,c...