| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3363 人关注过本帖
标题:设定成分含量的随机数生成
只看楼主 加入收藏
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1744
专家分:3216
注 册:2015-12-2
收藏
得分:0 
回复 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编辑过]

2016-09-07 12:17
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
    非常感谢ehszt和书生牛犊,帮助我编写、修改了程序,非常谢谢!!
    感谢lianyicq的讨论,谢谢!
    也感谢rjsp的帮助。
    待我把结果作出后,我会把结果公布在这个贴子里,请大家共同讨论!
    谢谢!!
2016-09-07 15:10
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
    非常感谢ehszt和书生牛犊,帮助我编写、修改了程序,非常谢谢!!
    感谢lianyicq的讨论,谢谢!
    也感谢rjsp的帮助。
    待我把结果作出后,我会把结果公布在这个贴子里,请大家共同讨论!
    谢谢!!
2016-09-07 15:10
快速回复:设定成分含量的随机数生成
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018310 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved