规则
“双色球”每注投注号码由 6 个红色球号码和 1 个蓝色球号码组成。红色球号码从 1--33 中选择;蓝色球号码从 1--16 中选择。“双色球”每注 2 元。总而言之,就是从 1-33 个数中选择 6 个数,再从 1-16 个数中选择 1 个数。中奖的条件如下:
编写思路
编写该程序我使用了结构体数组。如果这个号码被选中,就会被标记,下次就不会选择。选择我使用了随机数生成,并且随机种子使用了毫秒级别,防止短时间内产生两相同的数。
首先生成一组双色球中奖号码。然后用循环随机生成 N 组购买号码,使用购买号码与中奖号码进行对比来确定是否中奖,以及中奖等级,然后计算中奖金额,将中奖的总次数除以购买的次数,就可以计算出中奖率,如果次数不够,计算出来的就不准确,我使用 1000000 次,可以模拟出中奖率在 6.7% 左右。但是中一等奖的概率是几乎没有。
感兴趣的同学可以将多试几次看能否出现一等奖。
运行结果
源码
// 程序功能:双色球中奖率计算
// 编译环境:VS2013
// 结 论:中奖率为 6.7%
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<time.h>
#include<sys/timeb.h>
struct RED
{
bool IS_CHOSE;
int number;
};
struct BLUE
{
bool IS_CHOSE;
int number;
};
void initBALL(RED *red, BLUE *blue);
void printfZJ(RED *red, BLUE *blue);
int printfZT(RED *red, BLUE *blue, RED *myred, BLUE *myblue);
int main()
{
struct timeb timeSeed;
ftime(&timeSeed);
srand(timeSeed.time * 1000 + timeSeed.millitm);
printf("彩票中奖号码为:\n");
RED red[33];
BLUE blue[16];
initBALL(red, blue);
printfZJ(red, blue);
int CS = 1000000; // 购买次数
int ZERO = 0;
int ONE = 0;
int TWO = 0;
int THREE = 0;
int FOUR = 0;
int FIVE = 0;
int SIX = 0;
for (int i = 0; i < CS; i++)
{
//printf("购买的彩票号码为:\n");
RED myred[33];
BLUE myblue[16];
initBALL(myred, myblue);
//printfZJ(myred, myblue);
int DJ = printfZT(red, blue, myred, myblue);
switch (DJ)
{
case 0:ZERO++; break;
case 1:ONE++; break;
case 2:TWO++; break;
case 3:THREE++; break;
case 4:FOUR++; break;
case 5:FIVE++; break;
case 6:SIX++; break;
}
}
printf("总共选择%d次\n", CS);
printf("没中奖%d次\n", ZERO);
printf("一等奖%d次\n", ONE);
printf("二等奖%d次\n", TWO);
printf("三等奖%d次\n", THREE);
printf("四等奖%d次\n", FOUR);
printf("五等奖%d次\n", FIVE);
printf("六等奖%d次\n", SIX);
int outmoney = CS * 2;
int inmoney = SIX * 5 + FIVE * 10 + FOUR * 200 + THREE * 3000 + TWO * 341021 + ONE * 10000000;
printf("共耗资%d元,中奖%d元,亏损%d元\n", outmoney, inmoney, outmoney - inmoney);
int ZJ = CS - ZERO;
double ZJL = (ZJ*1.0) / CS * 100;
printf("中奖率为:%lf", ZJL);
_getch();
return 0;
}
void initBALL(RED *red, BLUE *blue)
{
for (int i = 0; i < 33; i++)
{
red[i].IS_CHOSE = false;
red[i].number = i + 1;
}
for (int i = 0; i < 16; i++)
{
blue[i].IS_CHOSE = false;
blue[i].number = i + 1;
}
for (int i = 0; i < 6; i++)
{
while (true)
{
int NUM = rand() % 33 + 1;
if (red[NUM - 1].IS_CHOSE)
{
continue;
}
else
{
red[NUM - 1].IS_CHOSE = true;
red[NUM - 1].number = NUM;
break;
}
}
}
int NUM = rand() % 16 + 1;
blue[NUM - 1].IS_CHOSE = true;
}
void printfZJ(RED *red, BLUE *blue)
{
printf("红色球为\n");
for (int i = 0; i < 33; i++)
{
if (red[i].IS_CHOSE)
{
printf("%d\t", red[i].number);
}
}
printf("\n");
printf("蓝色号为:\n");
for (int i = 0; i < 16; i++)
{
if (blue[i].IS_CHOSE)
{
printf("%d\t\n", blue[i].number);
}
}
}
int printfZT(RED *red, BLUE *blue, RED *myred, BLUE *myblue)
{
int rednumber = 0;
int bluenumber = 0;
for (int i = 0; i < 33; i++)
{
if (red[i].IS_CHOSE)
{
for (int j = 0; j < 33; j++)
{
if (myred[j].IS_CHOSE)
{
if (red[i].number == myred[j].number)
{
rednumber++;
break;
}
}
}
}
}
for (int i = 0; i < 16; i++)
{
if (blue[i].IS_CHOSE)
{
for (int j = 0; j < 16; j++)
{
if (myblue[j].IS_CHOSE)
{
if (blue[i].number == myblue[j].number)
{
bluenumber++;
break;
}
}
}
break;
}
}
//printf("红色中%d\t蓝色中%d\n",rednumber,bluenumber);
int DJ = 0;
if (rednumber == 6 && bluenumber == 1)
{
DJ = 1;
}
if (rednumber == 6 && bluenumber == 0)
{
DJ = 2;
}
if (rednumber == 5 && bluenumber == 1)
{
DJ = 3;
}
if (rednumber == 5 && bluenumber == 0)
{
DJ = 4;
}
if (rednumber == 4 && bluenumber == 1)
{
DJ = 4;
}
if (rednumber == 4 && bluenumber == 0)
{
DJ = 5;
}
if (rednumber == 3 && bluenumber == 1)
{
DJ = 5;
}
if ((rednumber == 2 && bluenumber == 1) || (rednumber == 1 && bluenumber == 1) || (rednumber == 0 && bluenumber == 1))
{
DJ = 6;
}
return DJ;
}
到此这篇关于C语言实现计算双色球的中奖率的文章就介绍到这了,更多相关C语言计算双色球中奖率内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!