Re: [問題] 亂數產生數值,需要到小數點第二位.
原敘述有點亂,猜下面方式可解決你的問題。
※ 引述《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
討論串 (同標題文章)
完整討論串 (本文為第 3 之 3 篇):