[問題] C++中的亂數

看板C_and_CPP (C/C++)作者 (天王寺 蒼嵐)時間16年前 (2009/11/10 15:01), 編輯推噓2(2014)
留言16則, 6人參與, 最新討論串1/1
小弟在作一個作業的時候 必須取得一個亂數 其範圍在-16.536~16.536之間 我原本使用的code(單單只有取亂數的部份)是 #include "stdafx.h" #include <iostream> #include <math.h> #include <stdlib.h> #include <time.h> using namespace std; double random_number(); int main() { double a; a = random_number(); cout << a << endl; system("pause"); return 0; } double random_number() { srand((unsigned int)time(NULL)); double a = 16383.5; double b = rand(); b -= a; b /= a; b *= 16.536; return b; } 結果發生的情況是 因為time(NULL)都靠時間取亂數 結果每次跑這個程式都得到沒有很大差別的亂數 因為必須在很短的時間內取到四個亂數 而且亂數的值必須要比較多變 所以也沒辦法先取%再轉換範圍 那樣值的選擇性會變的很少 有大大可以給點建議 怎麼樣可以確實的取到亂數嗎? -- 用妳給的承諾描繪愛情的輪廓 用妳美麗的笑容填入愛情的顏色 完成的那副情景,叫做幸福 而我是個畫家 我的工作就是完成這幅圖畫 並一輩子守護著它 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.124.71.6 ※ 編輯: darkather 來自: 140.124.71.6 (11/10 15:04)

11/10 15:06, , 1F
怪怪的....srand是指你從那亂數表的那個位置開始取亂數
11/10 15:06, 1F

11/10 15:07, , 2F
跟你多快取一次亂數無關吧......有錯請鞭
11/10 15:07, 2F

11/10 15:08, , 3F
所以就只要最一開始做一次srand就可以了
11/10 15:08, 3F

11/10 15:12, , 4F
srand()不要放在這個func裡面
11/10 15:12, 4F

11/10 15:14, , 5F
你的seed,除了time,可以加入process/thread id的因素.
11/10 15:14, 5F

11/10 15:14, , 6F
例如 srand( time(NULL) ^ getpid() ); 之類的
11/10 15:14, 6F

11/10 15:20, , 7F
回應一樓,我有嘗試在一開始就做srand
11/10 15:20, 7F

11/10 15:20, , 8F
結果還是一樣,就是假如我第一次跑得到12457
11/10 15:20, 8F

11/10 15:21, , 9F
過沒多久再跑一次就是12460,然後12464...都這樣
11/10 15:21, 9F

11/10 15:22, , 10F
回應四樓,我可以把它放到MAIN去,可是結果沒有改變
11/10 15:22, 10F

11/10 15:22, , 11F
回應五樓,我如果想加上那個getpid,要加什麼標頭檔呢?
11/10 15:22, 11F

11/10 15:27, , 12F
google getpid
11/10 15:27, 12F

11/10 15:40, , 13F
以前有觀察到rand()在srand()之後幾次會有「不亂」的
11/10 15:40, 13F

11/10 15:41, , 14F
現象…你可以考慮取一百或兩百次亂數再使用最後四個
11/10 15:41, 14F

11/10 15:41, , 15F
當然srand()只能在主程式中執行
11/10 15:41, 15F

11/10 15:41, , 16F
你的問題應該是每次執行程式 亂數表就會用srand重置
11/10 15:41, 16F
文章代碼(AID): #1A-G_2RR (C_and_CPP)
文章代碼(AID): #1A-G_2RR (C_and_CPP)