大傻曾经玩过十一运夺金,这是一种合法的网络彩票。
具体彩票信息详见:http://caipiao.taobao.com/lottery/order/lottery_dj.htm
大傻曾在一个星期内赚了5000多,当时很羡慕。我劝他见好就收,他还是坚持,可惜好景不常,最后把赚了的都亏了,还倒贴了许多。
暑假闲来无事,仔细的看了一下十一运夺金,感觉这个比那个大乐透更可靠。刚开始研究了伪随机数的产生,后来开始研究彩票选号策略。很小的时候就YY过,研究出彩票中的数学规律,然后-----口水直流。曾在看到过某国的某个天才即然可以算出某些类型彩票的中奖号码。
即然试图探索彩票中的奥秘,那么必须进行实验。如果是在实际中进行实验,我相信我还没找到规律我就已经破产了,所以必须想个其它的法子。刚好我会编程,用visual C++6.0做了一个十一运夺金的模拟系统,首先得说下工作原理,本程序事实是彩票的“重演”,通过记录已有的所有彩票数据,将他们以文件的形式输入到程序中,自己通过将制定的选号策略编成函数,通过历史数据进行检验,这样就相当于在现实中购买了彩票。
如果能研究出规律固然好,否则就当复习C+概论+统计+随机数的产生。
收集数据真是一个体力活,程序还只有7.6日的数据
以下是代码:
#include<iostream>
#include<ctime>
using namespace std;
//freeze 2011-7-8
typedef struct Ticket
{
long N;//期数
short A;//第一个数
short B;//第二个数
short C;//第三个数
short D;//第四个数
short E;//第五个数
}Ticket;//定义彩票结构体
typedef struct Choice //不同玩法需更改
{
//此处选择 前一直选玩法 使用胆拖选二个号码,猜中开奖号码的第一个数字
int n1;
int n2;
}Choice;
void toString(char a[],int b);//将月份与日期转化为字符串格式,便于拼接
void myMethod(Ticket ticket[],int i,Choice * mychoice);//选号方法
void caculateMoney(Ticket ticket[],int i,Choice mychoice,int *money);//计算本次收益
int main()
{
FILE *fp=NULL;//fp用于打开彩票数据
Ticket ticket[66];//用于存储一天内的所有彩票
Choice mychoice;
int month,day,i,money=0;//month是月,day是日,i用于循环期数,money为钱
char flag;
char m[3],d[3];
char file[9];
while (1)
{
cout<<"输入日期以获取数据,月:";
cin>>month;
cout<<"日:";
cin>>day;
cout<<"是否确定(y/n):";
getchar();
if ((flag=getchar())=='y')
{
break;
}
}
toString(m,month);
toString(d,day);
strcpy(file,m);
strcat(file,d);
strcat(file,".txt");
if ((fp=fopen(file,"r"))==NULL)
{
cout<<"打开彩票数据文件失败!"<<endl;
exit(1);
}
for (i=1;i<=65;i++)
{
fscanf(fp,"%d %d %d %d %d %d",&(ticket[i].N),&(ticket[i].A),&(ticket[i].B),&(ticket[i].C),&(ticket[i].D),&(ticket[i].E));
cout<<month<<"月"<<day<<"日第"<<i<<"期:";
printf("%3d,%3d,%3d,%3d,%3d\n",ticket[i].A,ticket[i].B,ticket[i].C,ticket[i].D,ticket[i].E);
//不同玩法需更改
myMethod(ticket,i,&mychoice);
cout<<"我的前一直选玩法:"<<mychoice.n1<<" "<<mychoice.n2<<endl<<endl;
caculateMoney(ticket,i,mychoice,&money);
}
cout<<month<<"月"<<day<<"日您一共收益"<<money<<"元"<<endl;
fclose(fp);
return 0;
}
void toString(char a[3],int b)
{
a[0]=b/10+48;
a[1]=b%10+48;
a[2]='\0';
}
void myMethod(Ticket ticket[],int i,Choice * mychoice)//不同玩法需更改
{
srand(time(NULL));
int temp=0;
if(i<=2)//头两次区别对待
{
while (temp==0)
{
temp=rand()%12;
mychoice->n1=temp;
}
temp=0;
if (i==2)
mychoice->n2=ticket[i-1].A;
else
while (temp==0||temp==mychoice->n1)
{
temp=rand()%12;
mychoice->n2=temp;
}
}
if (i>2)//一个号与前一次相同,还有一个号选前两个相加与11求与
{
mychoice->n1=ticket[i-1].A;
temp=(ticket[i-1].A+ticket[i-2].A)%12;
if (temp==0)
mychoice->n2=1;
else
mychoice->n2=temp;
}
}
void caculateMoney(Ticket ticket[],int i,Choice mychoice,int *money)//不同玩法需更改
{
*money=*money-4;//彩票成本两张4元
if (mychoice.n1==ticket[i].A||mychoice.n2==ticket[i].A)
{
*money=*money+13;
}
}