Re: [問題] 亂數產生數值,需要到小數點第二位.

看板C_and_CPP作者 (藍影)時間13年前 (2012/03/07 14:09), 編輯推噓0(001)
留言1則, 1人參與, 最新討論串3/3 (看更多)
原敘述有點亂,猜下面方式可解決你的問題。 ※ 引述《bernachom (Terry)》之銘言: : 開發平台(Platform): (Ex: VC++, GCC, Linux, ...) : VC++ : 我需要輸入一個數值的區間,然後百分之80產生較小的數值,其它百分之20是較長的數值。 : 例如: : [10,20],要產生10個亂數 : 產生的結果可能會是這個樣子. : 10 20 10 10 10 10 10 10 10 19 : 10比較小所以有80%產生的機率,其它10~20有百分之20產生的機率。 #define LOW 10 /* 下限 */ #define N 11 /* 個數 */ 我的作法是,用一 double column_prob[20-10+1]; 做累計機率 由於你第 0 個元素機率為 0.8 (80%), 所以 column_prob[0] = 0.8 ; 接下來的 0.2 (20%) 機率平均分配給其它 10 (N-1) 個元素, for(i=1; i<N; ++i) column_prob[i] = column_prob[0] + (1-column_prob[0]) * i / (N-1); 顯示出來後結果會是 prob[0] = 0.800000 prob[1] = 0.820000 prob[2] = 0.840000 prob[3] = 0.860000 prob[4] = 0.880000 prob[5] = 0.900000 prob[6] = 0.920000 prob[7] = 0.940000 prob[8] = 0.960000 prob[9] = 0.980000 prob[10] = 1.000000 累計機率算完後就簡單了,隨機產生一個浮點數,去判斷落在哪個區間即可。 ex : double rnd = (double)rand() / RAND_MAX; // 產生 [0,1] 亂數 for(i=0; column_prob[i]>rnd; ++i); // 求得 rnd <= column_prob[i] 之 min i. int result = i+LOW; // 從第 LOW 個數來第 i 個即為所求。 方法算容易,不同數字有不同機率也可以、數字不連續也行, 總之把累計機率表填完大致上就做完了。 -- 我知道 ~ 但別說出來 , 說出來讓人感到特別難過... -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 123.195.165.40

03/07 16:53, , 1F
謝謝您,我研究一下,謝謝
03/07 16:53, 1F
文章代碼(AID): #1FLlkeUy (C_and_CPP)
文章代碼(AID): #1FLlkeUy (C_and_CPP)