随机程序为啥咋整都不随机?

guoguan1234567 2012-03-09 07:45:13
下面是一个随机小程序。主要思路是:随机生成一个双色球方案,然后对随机生成的双色球方案按要求过滤。如此一直循环往复下去(超大随机数量)。


#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微秒一个循环)的情况下,保证程序的随机性能通过随机性检测(随机周期最长)。谢谢!!!


...全文
263 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
cheung189 2012-04-19
  • 打赏
  • 举报
回复
reandom is not realy randome ,you must set the seed
guoguan1234567 2012-04-19
  • 打赏
  • 举报
回复
楼主发表于:2012-04-17 20:05:27IvyBridge引用了一个高质量/高性能的数字随机数发生器DRNG。(如下图所示)这个DRNG是为了符合各类标准而设计的,如ANSIx9.82、NIST SP 800-90以及NIST FIPS 140-2/3 Level 2等。通过“RDRAND-可供所有特权级/运行模式使用”指令,可以把一个随机数(可以是16位、32位或者是64位)返回到目的寄存器,RDRAND通过CPUID.1.ECX引用。


Ivy Bridge将会集成一个高质量、高性能的数字随机数生成器(DRNG),可用于AES加密等方面,兼容一系列ANSI(美国国家标准化组织)、NIST(美国国家标准与技术研究院)标准,还有新的指令“RDRAND”。VIA应该会感到有些紧张。




这个随机数发生器有什么优点?有什么缺点?

这个随机数发生器是真随机数发生器吗?与现今世界上的软件随机数发生器相比,产生速率快吗?与现今世界上的软件随机数发生器相比,有什么优点?有什么缺点?


是当今产生随机数最快的芯片吗?如果让IvyBridge只产生随机数,他的产生速率还能提高吗?

guoguan1234567 2012-03-14
  • 打赏
  • 举报
回复

有偿求一个C语言双色球随机算法




求一个C语言双色球随机算法


要求:能够生成标准双色球方案(5个6红1蓝组成一个标准双色球方案),生成范围分别是1-33(红球),1-16(篮球),生成的每个数的概率必须一致。要求每个球的产生都是随机的,每个球随机生成的概率都是一样的!(注意使用rand()函数的时候调用到一定次数就会出现重复的结果,需要自己实现随机算法,可不使用rand())

要求程序每次机选出来的方案是随机的(符合数学方法算出的概率),机选出来的数据要不断更新,我目前的普通双核台式机,实测处理速度是:大约1微秒中产生一个方案。要求无论循环多少次都符合随机概率。
特别建议:采用64位随机数发生器。因为程序本身的运行速度很快,如果用32位的,随机序列的周期就显得过短,执行很多次数后就会重复。这个你要特别注意。把随机数位长加到64位,这样才不不会让序列重复。




建议在内存里或DOS里用来做。有(伪)随机数发生器或随机算法相关经验者优先。






我在线时间一般是19点至21点左右。我不在可留言.我打字速度慢,最好你有耳麦或语聊条件(便于快速沟通)。
电话:13776082765(可随时短信联系)qq:844047605

一切一切问题,欢迎沟通!











预备知识:



(1)05081214252912|03041516242706|05081217293110|02151819223108|11121628303307
(2)06091316192808|05081221303306|10111726293107|02161722252610|04132527283112
(3) 08121320273206|06101216183212|05071723252907|01050708172108|03091126313310
(4) 05071723252908|01050708172110|08121320273206|03091126313312|06101216183207
(5) 07101112273207|06171921232708|01141622252706|21222426303212|04060712192610
(6) 04091015182210|01101923283307|12162328293208|05061526273112|02172324262906
(7) 06102327293212|01092326303210|01121320222308|02041322313206|06101620222807

名词解释:

()“双色球”彩票投注区分为红色球号码区和蓝色球号码区。

()“双色球”每注投注号码由6个红色球号码和1个蓝色球号码组成。红色球号码从1--33中选择;蓝色球号码从1--16中选择。
() 双色球方案:每个双色球方案由若5注投注号码组成,每注投注号码由6个红球号码和1个蓝球号码构成。
每个双色球方案为一行(例如:上例中,就是7个双色球方案)。

单式投注号码:每注单式投注号码由6个红球号码和1个蓝球号码构成,5注投注号码组成一个双色球方案。
例如:第一个方案里,05081214252912这组数字就是1注典型的单式投注号码,前6个数字(050812142529)是代表红球号码,第7个数字12代表蓝球。以此类推。
红球号码:前6个数字代表红球号码
蓝球号码:第7个数字代表蓝球号码

4329这个双色球方案就是由若5注单式投注号码组成的:
第一注:红球:050812142529蓝球:12
第二注:红球:030415162427蓝球:06
第三注:红球:050812172231蓝球:10
第四注:红球:021518192231蓝球:08
第五注:红球:111216283033蓝球:07

下面就是一个典型的双色球方案(符合格式的机选双色球彩票方案):
自信男孩 2012-03-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 pathuang68 的回复:]
楼主先用一个小程序,试着用一下srand和rand来产生随机数,以了解其用法。

从理论上来说,计算机不可能产生绝对随机的数字,所谓的随机数都是“伪随机”的
[/Quote]
++
建议你把产生随机数的函数单独拉出来测试,如果这是随机数产生的错误,那么就修改这个函数,和其他的函数没有关系。
赵4老师 2012-03-14
  • 打赏
  • 举报
回复
随机一定有重复;所谓“不重复的随机”不是随机,是洗牌。
calvin_guo 2012-03-14
  • 打赏
  • 举报
回复
编程序都是伪随机的
guoguan1234567 2012-03-13
  • 打赏
  • 举报
回复



有偿求一个C语言双色球随机算法




求一个C语言双色球随机算法


要求:能够生成标准双色球方案(5个6红1蓝组成一个标准双色球方案),生成范围分别是1-33(红球),1-16(篮球),生成的每个数的概率必须一致。要求每个球的产生都是随机的,每个球随机生成的概率都是一样的!(注意使用rand()函数的时候调用到一定次数就会出现重复的结果,需要自己实现随机算法,可不使用rand())

要求程序每次机选出来的方案是随机的(符合数学方法算出的概率),机选出来的数据要不断更新,我目前的普通双核台式机,实测处理速度是:大约1微秒中产生一个方案。要求无论循环多少次都符合随机概率。

建议在内存里或DOS里用来做。有(伪)随机数发生器或随机算法相关经验者优先。






我在线时间一般是19点至21点左右。我不在可留言.我打字速度慢,最好你有耳麦或语聊条件(便于快速沟通)。
电话:13776082765(可随时短信联系)qq:844047605

一切一切问题,欢迎沟通!











预备知识:



(1)05081214252912|03041516242706|05081217293110|02151819223108|11121628303307
(2)06091316192808|05081221303306|10111726293107|02161722252610|04132527283112
(3) 08121320273206|06101216183212|05071723252907|01050708172108|03091126313310
(4) 05071723252908|01050708172110|08121320273206|03091126313312|06101216183207
(5) 07101112273207|06171921232708|01141622252706|21222426303212|04060712192610
(6) 04091015182210|01101923283307|12162328293208|05061526273112|02172324262906
(7) 06102327293212|01092326303210|01121320222308|02041322313206|06101620222807

名词解释:

()“双色球”彩票投注区分为红色球号码区和蓝色球号码区。

()“双色球”每注投注号码由6个红色球号码和1个蓝色球号码组成。红色球号码从1--33中选择;蓝色球号码从1--16中选择。
() 双色球方案:每个双色球方案由若5注投注号码组成,每注投注号码由6个红球号码和1个蓝球号码构成。
每个双色球方案为一行(例如:上例中,就是7个双色球方案)。

单式投注号码:每注单式投注号码由6个红球号码和1个蓝球号码构成,5注投注号码组成一个双色球方案。
例如:第一个方案里,05081214252912这组数字就是1注典型的单式投注号码,前6个数字(050812142529)是代表红球号码,第7个数字12代表蓝球。以此类推。
红球号码:前6个数字代表红球号码
蓝球号码:第7个数字代表蓝球号码

4329这个双色球方案就是由若5注单式投注号码组成的:
第一注:红球:050812142529蓝球:12
第二注:红球:030415162427蓝球:06
第三注:红球:050812172231蓝球:10
第四注:红球:021518192231蓝球:08
第五注:红球:111216283033蓝球:07

下面就是一个典型的双色球方案(符合格式的机选双色球彩票方案):
05081214252912|03041516242706|05081217293110|02151819223108|11121628303307
alang512 2012-03-10
  • 打赏
  • 举报
回复

兄弟,搞彩票程序把,看这个博客吧。值得你参考下。http://blog.163.com/wenxianliang08@126/
zhouzhipen 2012-03-10
  • 打赏
  • 举报
回复
可以用硬件来做做,现在有很多随机数发生器
猪皮冻 2012-03-10
  • 打赏
  • 举报
回复
电脑产生的是伪随机的数,有种子的
guoguan1234567 2012-03-10
  • 打赏
  • 举报
回复
我对随机性的要求并不高:只要接近真随机就可以了。我们对随机只要满足“不可预测”一般就差不多了。我所指的是,在满足这种“最基本的随机标准”的前提下,再最大限度地提高随机程序的运行速度。我现在手头上的一个程序,随机程序需要1微秒左右产生一个随机数。要利用它产生大量的随机数。目前处理速度达到了,但是,产生的随机数就是不随机(连基本的随机标准都达不到)。修改了好多次,就是不随机。还找不出问题出在哪里。
zhangdian 2012-03-09
  • 打赏
  • 举报
回复
计算机上的随机数都是有个种子参数的,不可能真的随机,,我觉得你要做双色球,不如根据X2分布自己通过电脑选得了。。。
AnYidan 2012-03-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 pathuang68 的回复:]
楼主先用一个小程序,试着用一下srand和rand来产生随机数,以了解其用法。

从理论上来说,计算机不可能产生绝对随机的数字,所谓的随机数都是“伪随机”的
[/Quote]

++
nossiac 2012-03-09
  • 打赏
  • 举报
回复
单纯的rand函数产生的序列其实是固定的,一般都用系统时间做“种子”。
v风雪山神庙v 2012-03-09
  • 打赏
  • 举报
回复
给你一段产生随机数的代码

/* rand example: guess the number */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main ()
{
int iSecret, iGuess;

/* initialize random seed: */
srand ( time(NULL) );

/* generate secret number: */
iSecret = rand() % 10 + 1;

do {
printf ("Guess the number (1 to 10): ");
scanf ("%d",&iGuess);
if (iSecret<iGuess) puts ("The secret number is lower");
else if (iSecret>iGuess) puts ("The secret number is higher");
} while (iSecret!=iGuess);

puts ("Congratulations!");
return 0;
}
pathuang68 2012-03-09
  • 打赏
  • 举报
回复
楼主先用一个小程序,试着用一下srand和rand来产生随机数,以了解其用法。

从理论上来说,计算机不可能产生绝对随机的数字,所谓的随机数都是“伪随机”的
bjbjbh 2012-03-09
  • 打赏
  • 举报
回复
是不是srand的位置放的不对,写在初始化的时候的看看
bluewanderer 2012-03-09
  • 打赏
  • 举报
回复
你想得到什么?

网上可以搜到N多伪随机生成算法。

69,364

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧