回复 29楼 zhou31146001
zhou31146001,你好:如果你要产生ROUND*NUMBER个0-(NUMBER-1)以内的数,并且0-(N-1)内ROUND*N个,N-(NUMBER-1)内ROUND*M个(要保证M+N=NUMBER)。
以下程序可以满足要求:
#include <stdio.h>
#include <stdlib.h>
#include <string.h> //常用于函数strlen、strcmp、strcpy等等
#include <time.h>
#define NUMBER 400400 //生成随机数的长度,或每NUMBER个数统计一次 修改(仅目标粒子:干扰粒子比值变化时修改)
#define ROUND 10 //生成50个随机序列
#define N 400 //表示200个目标粒子可能对应的全部随机数 修改
#define M 400000 //表示干扰粒子可能对应的全部随机数 修改
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 mubiao_count = 0;
int ganrao_count = 0; //整数型占4个字节,字符型占1个字节,当将整数赋值给字符数组时会引起溢出,无法运行程序;字符型数组必须以"\0"结尾
int mubiao_flag = 0;
int ganrao_flag = 0;
int i, j,h,k;
//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] = rand_ret; //rand_ret介于1-6间,该行通过char_arr1[0]=A和char_arr1[1]=T来随机生成A和T
mubiao_count++; //AT_count用来计数随机数的个数,确保指定随机数的含量
if(mubiao_count == N) // 变化
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] = rand_ret; //生成C和G
ganrao_count++;
if(ganrao_count ==M) //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;
}
至于理论上我就帮不了什么忙了。
[此贴子已经被作者于2016-9-7 12:33编辑过]