最近在做一個回合制遊戲,要實現暴擊閃避的判斷,這就要一個隨機數進行判斷比較了。
之前一直在用srand((int)time(0)); rand();的組合,但是這個是以秒為單位的,同秒之內。。基本沒區別,畢竟我回合制裡邊,法師一個aoe,肯定要一個迴圈瞬間判斷給予每個敵人(多個物件同時調用rand())的傷害,就是機器再爛。。也不會超過1秒這麼大的延遲吧。。就一直要麼全閃避,要麼全暴擊,雖然不是次次這樣,但是超過80%是這種雷同情況,讓人蛋疼而憂傷。 - -||
所以查資料發現了GetTickCount();這個函數 ,是微妙級的,可用於隨機種子srand(GetTickCount());但依然各種雷同,N胞胎,蛋疼而憂傷。。 - -||
很多人都說c/c++裡沒有真正的隨機,除非量子電腦,也就是硬體支援才行。看來只能靠手法解決了。所以試了試,種子裡邊再加個隨機rand(),哇塞~居然成功了~^_^
終極形式,就是用這個作為種子:srand(GetTickCount()+ rand());
經驗證,ok的,瞬間多少次,不同對象同時rand(),都結果不同,哇哈哈,當然種子後邊這個rand()的要根據需求2次處理,大家隨意,重點是這個隨機種子的處理。
可惜的是GetTickCount()屬於win,打包apk的時候會報錯,經測試,簡單點的方法是種子函數改為: srand(int(time(0))+ rand());
複雜點的就是利用linux裡的clock_gettime函數重新實現一下,代碼如下
// 返回自系統開機以來的毫秒數(tick)unsigned long GetTickCount(){ struct timespec ts; clock_gettime(CLOCK_MONOTONIC, &ts); return (ts.tv_sec * 1000 + ts.tv_nsec / 1000000);}int main(){ struct timespec time1 = { 0, 0 }; clock_gettime(CLOCK_REALTIME, &time1); printf("CLOCK_REALTIME: %d, %d\n", time1.tv_sec, time1.tv_nsec); clock_gettime(CLOCK_MONOTONIC, &time1); printf("CLOCK_MONOTONIC: %d, %d\n", time1.tv_sec, time1.tv_nsec); clock_gettime(CLOCK_MONOTONIC_RAW, &time1); printf("CLOCK_MONOTONIC_RAW: %d, %d\n", time1.tv_sec, time1.tv_nsec); clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time1); printf("CLOCK_PROCESS_CPUTIME_ID: %d, %d\n", time1.tv_sec, time1.tv_nsec); clock_gettime(CLOCK_THREAD_CPUTIME_ID, &time1); printf("CLOCK_THREAD_CPUTIME_ID: %d, %d\n", time1.tv_sec, time1.tv_nsec); printf("\n%d\n", time(NULL)); printf("tick count in ms: %ul\n", GetTickCount()); return 0;}