随机程序为啥咋整都不随机?
下面是一个随机小程序。主要思路是:随机生成一个双色球方案,然后对随机生成的双色球方案按要求过滤。如此一直循环往复下去(超大随机数量)。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef struct
{
char red_ball[6];
char blue_ball;
} ShuangSeQiu_t;
ShuangSeQiu_t Data[5];
int GroupArrary[10][2]={{0,1},{0,2},{0,3},{0,4},{1,2},{1,3},{1,4},{2,3},{2,4},{3,4}};
#define GetANum(m) (rand()%m)
char Red[33];
char Blue[16];
void Init_Red_Ball()
{
int i;
for(i=0; i<33; i++)
Red[i] = i + 1;
}
void Init_Blue_Ball()
{
int i;
for(i=0; i<16; i++)
Blue[i] = i + 1;
}
void Rand_Red_Ball()
{
int index;
char t, w;
for(index=0; index<33; index++)
{
w = GetANum(33);
t = Red[index];
Red[index] = Red[w];
Red[w] = t;
}
}
void Rand_Blue_Ball()
{
int index;
char t, w;
for(index=0; index<16; index++)
{
w = GetANum(16);
t = Blue[index];
Blue[index] = Blue[w];
Blue[w] = t;
}
}
unsigned long int Total = 0;
int Each = 0;
int Five = 0;
int limit = 0;
void print_welcome()
{
printf("欢迎使用双色球方案生成系统\n");
}
void sort(ShuangSeQiu_t * ball)
{
int i,temp,flag = 0;
do
{
flag = 0;
for(i=0;i<5;i++)
if(ball->red_ball[i] > ball->red_ball[i+1])
{
flag = 1;
temp = ball->red_ball[i];
ball->red_ball[i] = ball->red_ball[i+1];
ball->red_ball[i+1] = temp;
}
} while (flag);
}
void PrintBall(ShuangSeQiu_t * ball)
{
int i;
for(i=0; i<6; i++)
{
printf("%02d ", ball->red_ball[i]);
}
printf("| %02d\n", ball->blue_ball);
}
void CreateBall(ShuangSeQiu_t * ball)
{
int j,k,flag = 0;
int blue_ball = Blue[GetANum(16)];
for(j=0; j<6; j++)
{
int red_ball;
do
{
flag = 0;
red_ball = Red[GetANum(33)];
for(k=0; k<j; k++)
{
if(ball->red_ball[k] == red_ball)
{
flag = 1;
}
}
} while (flag);
ball->red_ball[j] = red_ball;
}
//sort(ball);
ball->blue_ball = blue_ball;
}
int CheckEachSame(ShuangSeQiu_t * ball0, ShuangSeQiu_t * ball1)
{
int i,j,cnt=0;
for(i=0; i<6; i++)
{
for(j=0; j<6; j++)
{
if(ball0->red_ball[i] == ball1->red_ball[j])
{
cnt++;
if(cnt == Each)
return 1;
break;
}
}
}
return 0;
}
int CheckFiveSame(ShuangSeQiu_t *data)
{
int i,cnt=0;
for(i=0; i<10;i++)
{
if(CheckEachSame(&data[GroupArrary[i][0]], &data[GroupArrary[i][1]]))
cnt++;
if(cnt == Five)
return 1;
if(i - cnt >= limit)
return 0;
}
return 0;
}
unsigned long int JieCheng(int n)//n!
{
int i;
unsigned long int R =1;
for(i=2; i<=n; i++)
R *=i;
return R;
}
void main()
{
char en[10];
int l;
time_t start, finish;
unsigned long int rcnt = 0;
char path[50];
int i, j, k;
FILE * fp = NULL;
char buff[50];
unsigned long int a = 0;
/*
print_welcome();
printf("请输入生成的方案保存的路径:");
scanf("%s", path);
*/
while(1)
{
start = time(NULL);
itoa(start, path, 10);
strcat(path, ".txt");
printf("循环次数:");
scanf("%ld", &Total);
printf("单注比较:");
scanf("%d", &Each);
while(Each > 6 || Each < 1)
{
printf("输入错误,单注比较取值(1-6)\n");
printf("单注比较:");
scanf("%d", &Each);
}
printf("五注比较:");
scanf("%d", &Five);
while(Five > 10 || Five < 1)
{
printf("输入错误,五注比较取值(1-10)\n");
printf("五注比较:");
scanf("%d", &Five);
}
limit = 11-Five;
fp = fopen(path, "w+");
if(fp == NULL)
return;
sprintf(buff, "循环次数:%d\n",Total);
fwrite(buff, sizeof(char), strlen(buff), fp);
sprintf(buff, "单注比较:%d\n",Each);
fwrite(buff, sizeof(char), strlen(buff), fp);
sprintf(buff, "五注比较:%d\n\n",Five);
fwrite(buff, sizeof(char), strlen(buff), fp);
start = time(NULL);
srand(time(0));
Init_Red_Ball();
Init_Blue_Ball();
Rand_Red_Ball();
Rand_Blue_Ball();
for(a = 0; a < Total; a++)
{
for(i=0; i<5; i++)
{
CreateBall(&Data[i]);
//检查重复
for(j=0; j<i; j++)
{
if(Data[i].blue_ball == Data[j].blue_ball)
{
for(k=0; k<6; k++)
{
if(Data[i].red_ball[k] != Data[j].red_ball[k])
break;
}
if(k==6)
{
i--;
break;
}
}
}
}
if(CheckFiveSame(Data))
{
Rand_Red_Ball();
Rand_Blue_Ball();
rcnt++;
for(l=0;l<5;l++)
sort(Data+l);
sprintf(buff, "%ld %02d%02d%02d%02d%02d%02d%02d|%02d%02d%02d%02d%02d%02d%02d|%02d%02d%02d%02d%02d%02d%02d|%02d%02d%02d%02d%02d%02d%02d|%02d%02d%02d%02d%02d%02d%02d\n",rcnt+1,\
Data[0].red_ball[0],Data[0].red_ball[1],Data[0].red_ball[2],Data[0].red_ball[3],Data[0].red_ball[4],Data[0].red_ball[5],Data[0].blue_ball,\
Data[1].red_ball[0],Data[1].red_ball[1],Data[1].red_ball[2],Data[1].red_ball[3],Data[1].red_ball[4],Data[1].red_ball[5],Data[1].blue_ball,\
Data[2].red_ball[0],Data[2].red_ball[1],Data[2].red_ball[2],Data[2].red_ball[3],Data[2].red_ball[4],Data[2].red_ball[5],Data[2].blue_ball,\
Data[3].red_ball[0],Data[3].red_ball[1],Data[3].red_ball[2],Data[3].red_ball[3],Data[3].red_ball[4],Data[3].red_ball[5],Data[3].blue_ball,\
Data[4].red_ball[0],Data[4].red_ball[1],Data[4].red_ball[2],Data[4].red_ball[3],Data[4].red_ball[4],Data[4].red_ball[5],Data[4].blue_ball
);
//printf(buff);
fwrite(buff, sizeof(char), strlen(buff), fp);
}
}
/*
//01032022253305|01031622253305|01031622252609|03151620222505|03151625262705
Data[0].red_ball[0] = 1;
Data[0].red_ball[1] = 20;
Data[0].red_ball[2] = 3;
Data[0].red_ball[3] = 22;
Data[0].red_ball[4] = 33;
Data[0].red_ball[5] = 25;
Data[0].blue_ball = 5;
Data[1].red_ball[0] = 3;
Data[1].red_ball[1] = 1;
Data[1].red_ball[2] = 16;
Data[1].red_ball[3] = 22;
Data[1].red_ball[4] = 25;
Data[1].red_ball[5] = 33;
Data[1].blue_ball = 5;
Data[2].red_ball[0] = 1;
Data[2].red_ball[1] = 3;
Data[2].red_ball[2] = 26;
Data[2].red_ball[3] = 22;
Data[2].red_ball[4] = 25;
Data[2].red_ball[5] = 16;
Data[2].blue_ball = 9;
Data[3].red_ball[0] = 3;
Data[3].red_ball[1] = 15;
Data[3].red_ball[2] = 16;
Data[3].red_ball[3] = 25;
Data[3].red_ball[4] = 22;
Data[3].red_ball[5] = 20;
Data[3].blue_ball = 5;
Data[4].red_ball[0] = 16;
Data[4].red_ball[1] = 5;
Data[4].red_ball[2] = 3;
Data[4].red_ball[3] = 25;
Data[4].red_ball[4] = 26;
Data[4].red_ball[5] = 27;
Data[4].blue_ball = 5;
if(CheckFiveSame(Data))
{
for(l=0;l<5;l++)
sort(Data+l);
sprintf(buff, "%d %02d%02d%02d%02d%02d%02d%02d|%02d%02d%02d%02d%02d%02d%02d|%02d%02d%02d%02d%02d%02d%02d|%02d%02d%02d%02d%02d%02d%02d|%02d%02d%02d%02d%02d%02d%02d\n",a+1,\
Data[0].red_ball[0],Data[0].red_ball[1],Data[0].red_ball[2],Data[0].red_ball[3],Data[0].red_ball[4],Data[0].red_ball[5],Data[0].blue_ball,\
Data[1].red_ball[0],Data[1].red_ball[1],Data[1].red_ball[2],Data[1].red_ball[3],Data[1].red_ball[4],Data[1].red_ball[5],Data[1].blue_ball,\
Data[2].red_ball[0],Data[2].red_ball[1],Data[2].red_ball[2],Data[2].red_ball[3],Data[2].red_ball[4],Data[2].red_ball[5],Data[2].blue_ball,\
Data[3].red_ball[0],Data[3].red_ball[1],Data[3].red_ball[2],Data[3].red_ball[3],Data[3].red_ball[4],Data[3].red_ball[5],Data[3].blue_ball,\
Data[4].red_ball[0],Data[4].red_ball[1],Data[4].red_ball[2],Data[4].red_ball[3],Data[4].red_ball[4],Data[4].red_ball[5],Data[4].blue_ball
);
printf(buff);
fwrite(buff, sizeof(char), strlen(buff), fp);
}
*/
finish = time(NULL);
printf("处理完毕%ld | %.1f秒\n", rcnt, difftime( finish, start));
sprintf(buff, "\n用时: %.0f 秒",difftime( finish, start));
fwrite(buff, sizeof(char), strlen(buff), fp);
fclose(fp);
fp = NULL;
printf("继续(y)/结束(n)按[回车]确定\n");
scanf("%s",en);
if(en[0] == 'y' || en[0] == 'Y')
{
system("cls");
continue;
}
else
exit(0);
}
}
现在的问题是:产生的结果老是通不过随机性检测。已经改了好几次,可是程序就是老是不随机(产生的结果明显违背数学方法计算的概率)。
请高手们指点迷津。怎样在保证现有的处理速度(大约1微秒一个循环)的情况下,保证程序的随机性能通过随机性检测(随机周期最长)。谢谢!!!