大家好!
你好,书生牛犊!
模拟过程是:
模拟1000次,200个球进200个洞的实验结果;模拟1000次,200个球在200000个干扰球作用下进200个洞的实验结果。
虽然大家都不赞同我的理解,但和大家分享交流也是受益匪浅的。
我还是比较坚持我的理解,除非我模拟完成的结果不是我想要的,而是大家所说的。
目前我的程序出现了问题,我恳求大家先帮我解决这个问题,待我得到模拟结果后,我同样会把结果发在这个帖里,作为每个人观点的主要论据!!
程序现在很奇怪,当NUMBER设为200200时,程序就无法运行,出现下面的结果:
1.exe 已停止工作
Windows 可以联机检查该问题的解决方案
联机检查解决方案并关闭该程序
关闭程序
调试程序
一旦我令NUMBER为20020(小于200200),程序就可以运行,且输出正常结果。
这究竟是为什么,请各位大侠搁置争议,麻烦帮我解决这个问题,非常感谢!!!!!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//常用于函数strlen、strcmp、strcpy等等
#include <time.h>
#define NUMBER 200200
//生成随机数的长度,或每NUMBER个数统计一次
修改(仅目标粒子:干扰粒子比值变化时修改)
#define ROUND
10
//生成50个随机序列
#define N 200
//表示200个目标粒子可能对应的全部随机数
修改
#define M 200000
//表示干扰粒子可能对应的全部随机数
修改
#define P 1
//N 除以200
修改
int main()
{
//FILE *fp = NULL;
FILE * fp=fopen("E:\\suijishu-200200.txt","wt");
//修改
int rand_buff[NUMBER];
//若NUMBER八九千万甚至过亿长,必须加static,若不是不需加static;NUMBER加上1是为给换行符一个位置
int rand_ret = 0;
//生成随机数赋值给rand_ret
int char_arr1[M+N];
int mubiao_count = 0;
int ganrao_count = 0;
//整数型占4个字节,字符型占1个字节,当将整数赋值给字符数组时会引起溢出,无法运行程序;字符型数组必须以"\0"结尾
int mubiao_flag = 0;
int ganrao_flag = 0;
int i, j,h,k;
for(i=0;i<(M+N);i++)
char_arr1[i]=i;
//给char_arr1[]字符数组赋值0-N间的数字
//fp = fopen("random", "a+");
// if(fp == NULL)
//{
// perror("fopen");
//
return -1;
// }
//上述6行使文件无法输出内容,删掉
srand(time(NULL));
for(i = 0; i < ROUND; i++)
{
//memset(rand_buff, 0, sizeof(rand_buff));
//memset()函数的作用是对结构体或数组最快地进行清零,因此这里是对char rand_buff[]数组清零
for(k=0;k<NUMBER;k++)
rand_buff[k]=0;
//用这两行代替memset()函数
mubiao_count = 0;
ganrao_count = 0;
mubiao_flag = 0;
ganrao_flag = 0;
for(j = 0; j < NUMBER; j++)
{
rand_ret = (rand()*(RAND_MAX+1) + rand())%(M+N);
//随机数赋值给rand_set
if(rand_ret < N)
//上一行生成随机数共M+N个,令rand_ret<=N是为了确保指定随机数生成与指定随机数含量
{
if(!mubiao_flag)
//AT_full_flag=0,故!AT_full_flag的值为1,而1表示满足条件可运行;当AT_count满足含量后AT_full_flag变为1,!AT_full_flag为零,于是停止生成A和T
{
rand_buff[j] = char_arr1[rand_ret%N];
//rand_ret介于1-6间,该行通过char_arr1[0]=A和char_arr1[1]=T来随机生成A和T
mubiao_count++;
//AT_count用来计数随机数的个数,确保指定随机数的含量
if(mubiao_count >= (N/P))
//
变化
mubiao_flag = 1;
//AT_full_flag变为1后,!AT_full_flag为零,于是停止生成A和T
}
else
{
j--;
continue;
}
}
else
{
if(!ganrao_flag)
//CG_full_flag=0,!CG_full_flag=1,满足条件运行
{
rand_buff[j] = char_arr1[(rand_ret)%(M+N)];
//生成C和G
ganrao_count++;
if(ganrao_count >= (M/P))
//0.4表示C和G的总量
变化
ganrao_flag = 1;
//当C+G满足总量后,CG_full_flag变为1,如此!CG_full_flag=0,停止生成C和G
}
else
{
j--;
continue;
}
}
}
//rand_buff[NUMBER]='\0';
for(h=0;h<NUMBER;h++)
{
fprintf(fp,"%d\n",rand_buff[h]);
//printf("%d\n",rand_buff[h]);
}
printf("%d\n",i);
//fwrite(rand_buff, sizeof(rand_buff), 1, fp);
//其生成一堆乱码,生成纯字符或许可用它,但生成数字不可
}
fclose(fp);
return 0;
}