看板 C_and_CPP 關於我們 聯絡資訊
( *[1m *[m 為色碼,可以按 Ctrl+V 預覽會顯示的顏色 ) ( 未必需要依照此格式,文章條理清楚即可 ) 遇到的問題: (題意請描述清楚) 寫一程式抽出大樂透(1~46)的號碼,並將此程式執行1000次並計算各個號碼出現的次數 將結果輸出 希望得到的正確結果: 總和為1,不重複選取 程式跑出來的錯誤結果: 總和超過1,極少情況會重複選取 開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux) VC++(利用C++的寫法) 有問題的code: (請善用置底文標色功能) 補充說明: 底下為程式碼 #include <iostream> #include <stdlib.h> #include <time.h> using namespace std; int count[46]; void lotto(); void lotto() { int a[46],i,x; //srand((int)time(NULL)); for(i=0;i<46;i++) a[i]=i+1; for(i=0;i<6;i++) { //x=(rand()%(46-i))+1; x=int(double(rand())/RAND_MAX*(46-i)+1); swap(a[x],a[46-i]); cout<<a[46-i]<<" "; count[a[46-i]]++; } cout<< endl; } int main() { int a[46],i,j; srand((int)time(NULL)); for(i=0;i<46;i++) { a[i]=i+1; count[a[i]]=0; } for(j=0;j<1000;j++) { lotto(); //count[a[i]]++; //cout<<a[i]<<" 的機率 = "<<count[a[i]]/1000.0<<endl; } for(i=0;i<46;i++) cout<<a[i]<<" 的機率 = "<<count[a[i]]/1000.0<<endl; return 0; } 我的想法是:將各個數字放到對應的array,先抽出一個號碼 將他的位置和最後一個號碼(46)的位置互換,在輸出最後一個位置的號碼 下次選取時只要選到倒數第二個就可以了,重複六次輸出六個號碼 -- 這是個最好的時代,也是個最壞的時代,是最光明的時代,也是最黑暗的時代 龍臥虎今懦夫,裡罪容化成無 情冷暖難回首,多少傷心事 一沙一世界,一花一天堂,掌中盈無限,剎那即永恆。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.4.170
VictorTom:a[i]=i+1; 之後 count[a[i]]=0; 你的count就會access超 05/21 22:35
VictorTom:過array range了@_@" 05/21 22:35
dendrobium:x感覺會超過46 , 考慮rand()等於rand_max的情況, i=0 05/21 22:42
dendrobium:變成 1*46+1 = 47 05/21 22:43