作者obelisk0114 (追風箏的孩子)
看板C_and_CPP
標題[問題] 樂透程式結果錯誤
時間Fri May 21 22:18:09 2010
( *[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