作者pziyout (pziyout)
看板C_and_CPP
標題Re: [問題] 亂數產生數值,需要到小數點第二位.
時間Wed Mar 7 09:18:43 2012
※ 引述《bernachom (Terry)》之銘言:
: 開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
: VC++
: 問題(Question):
: 請教各位前輩們
: 我需要輸入一個數值的區間,然後百分之80產生較小的數值,其它百分之20是較長的數值。
: 例如:
: [10,20],要產生10個亂數
: 產生的結果可能會是這個樣子.
: 10 20 10 10 10 10 10 10 10 19
: 10比較小所以有80%產生的機率,其它11~20有百分之20產生的機率。
: 以[10,20]這個區間為例
: 我的做法是
: 先計算這個區間有幾個數值: 20-10+1 = 11,所以計算後這個區間有11個數值
: 然後11*0.8,就是百分之80的機率會產生較小的數值。
: 剩下的就是較長的數值。
: 但是,如果想要亂數產生較小數值的機率要到小數點第二位
: 應該如何做呢?
: 例如:百分之82(0.82)的機率會產生較小的數值。
: 我的方法好只能取到百分比整數而已
: 希望前輩們能給予一些想法,如何才能亂數產生數值的機率到小數點第二位。
: 謝謝幫忙。
使用 STL :
#include <iostream>
#include <algorithm>
#include <ctime>
#include <cstdlib>
#include <vector>
#include <iterator>
using namespace std ;
struct My_Random{
int a , b ; // random number in [a,b]
int r ; // random ratio for number a
My_Random( int s , int c , int d ) : r(s) , a(c) , b(d) {}
int operator() () const {
int u = rand()%100+1 ;
return ( u <= r ? a : rand()%(b-a)+a+1 ) ;
}
};
int main() {
vector<int> foo ;
srand( static_cast<unsigned>(time(NULL)) ) ;
int a , b , r , n ;
r = 82 ;
a = 10 ;
b = 20 ;
n = 50 ;
generate_n(back_inserter(foo),n,My_Random(r,a,b)) ;
copy(foo.begin(),foo.end(),ostream_iterator<int>(cout," ")) ;
cout << endl ;
return 0 ;
}
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.115.25.21
→ bernachom:我晚一點來修文,謝謝幫忙 03/07 12:25
→ bernachom:我推錯了...><,謝謝前輩幫忙,我研究看看 03/07 12:26