| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3588 人关注过本帖
标题:设定成分含量的随机数生成
取消只看楼主 加入收藏
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
结帖率:93.94%
收藏
已结贴  问题点数:30 回复次数:15 
设定成分含量的随机数生成
    请各位大侠帮忙,现纠结于如何生成规定成分含量的随机数!
    需要生成的随机数特点如下:
    1、生成1000个集合,每个集合含200200个随机数;
    2、每个集合的随机数均介于0-200200*N之间(要求0-200200*N之间共200200*N+1个随机数均能生成;N值可个人定义,1-100均可实现),而0-200*N之间的随机数必须满足在每个集合中均只有200个。
    对此已纠结很久,请各位大侠帮忙,谢谢!!
搜索更多相关主题的帖子: 如何 
2016-09-05 10:14
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
    rjsp,您好!
    1、绝对不能先单独生成200个0-200N之间的随机数,再生成200000个[200N+1,200200N]之间的随机数,然后将两者混在一起,必须是两者利用同一个随机生成函数同时进行生成,因为这样可以探讨两者在同时生成过程中的相互影响。
    2、如何在200200个随机数中保证[0,200N]之间随机数总数的含量,即必须只有200个[0,200N]之间随机数,这让我难于如何确定各成分含量!
    3、[0,200200N]之间的随机数必须每一个都有可能生成,但现有随机生成函数只能生成32767个非重复随机数,不论rand()%M中的M设为多大,无论生成多少个随机数。
2016-09-05 11:35
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
回复 4楼 rjsp
    您好,对于“3”,我看了链接,表达非常抱歉!
    但对于1和2,却是陷入困境,以下是我的程序,始终有问题,谢谢!!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>  //常用于函数strlen、strcmp、strcpy等等
#include <time.h>

#define NUMBER 200200      //生成随机序列的长度        变化
#define ROUND  10     //生成50个随机序列             变化

#define N 200     //表示200个目标粒子可能对应的全部随机数
#define M 20000   //表示干扰粒子可能对应的全部随机数

int main()
{
  //FILE *fp = NULL;
  FILE * fp=fopen("E:\\fenbu.txt","wt");
  static char rand_buff[NUMBER] = {0,};    //若NUMBER八九千万甚至过亿长,必须加static,若不是不需加static;NUMBER加上1是为给换行符一个位置
  char rand_ret = 0;    //生成随机数赋值给rand_ret
  char char_arr1[N];
  char char_arr2[M];
  short mubiao_count = 0;
  short ganrao_count = 0;
  char mubiao_flag = 0;
  char ganrao_flag = 0;
  int i = 0, j = 0,h=0;


  
  for(i=0;i<N;i++)
  char_arr1[i]=i;   //给char_arr1[]字符数组赋值0-N间的数字
  
  for(i=0;i<M;i++)
  char_arr1[i]=i+N;   //给char_arr1[]字符数组赋值0-N间的数字


  fp = fopen("random", "a+");
  if(fp == NULL)
  {
    perror("fopen");
    return -1;
  }   

  srand(time(NULL));

  for(i = 0; i < ROUND; i++)
  {
    memset(rand_buff, 0, sizeof(rand_buff));   //memset()函数的作用是对结构体或数组最快地进行清零,因此这里是对char rand_buff[]数组清零
    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)+1);  //随机数赋值给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];  //
          mubiao_count++;   //AT_count用来计数
          if(mubiao_count >= 200)      
            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_arr2[(rand_ret-N)%M];   //生成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,"%c",rand_buff[h]);
    //fwrite(rand_buff, sizeof(rand_buff), 1, fp);   //将生成的每一段随机序列写入fp文件
  }

  fclose(fp);
  return 0;
}
2016-09-05 14:50
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
回复 6楼 ehszt
    您好!
    我们这么想:
    200个目标粒子随机落入200个洞,经我的模拟计算,包含目标粒子的洞数的主峰值/最大值在127左右!
    现在,我们另200个目标粒子与20000个干扰粒子随机的掺在一起,这时令全部粒子随机的落向200个洞,我坚信这时包含目标粒子的洞数的主峰值/最大值绝对远大于127。
    因为,众多干扰粒子与目标粒子之间具有随机的相互作用,这种随机相互作用增强了目标粒子的自平均性,使目标粒子在干扰粒子的作用下将分布的更加均匀,于是包含目标粒子的洞数的主峰值/最大值绝对远大于127。
    因此,我敢说,随机生成1000组介于[0-200]之间的随机数(每组含200个随机数),与随机生成1000组介于[0-20200]之间的随机数(每组含20200个随机数),其中0-200的出现分布情况在两种条件下绝对存在差异。因此,我认为,这其实是有意义的,至少从模拟计算方面来讲。
    请赐教!!
    另外,大侠,请指教一下,我的程序到底错在哪了,这让我很纠结!!
2016-09-05 16:25
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
    您好,ehszt!
    程序目的见顶页!
    目前程序调试过程显示没有错(1.obj - 0 errors,0 warnings);
    但运行后显示以下内容:

    1.exe 已停止工作
    Windows 可以联机检查该问题的解决方案
    联机检查解决方案并关闭该程序
    关闭程序

    我想应是程序语法出现了问题或产生了语句冲突,但找不出根源来!
    请大侠帮忙,究竟是错在哪里?
    谢谢!!!
2016-09-05 17:09
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
回复 10楼 ehszt
    您好!
    还是存在小的问题!
    不能正常输出!!
    谢谢!!
2016-09-05 19:03
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
回复 12楼 ehszt
    您好,这是最新的修改程序,输出有问题,严重偏离期望结果!
    谢谢!!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>  //常用于函数strlen、strcmp、strcpy等等
#include <time.h>

#define NUMBER 2020      //生成随机序列的长度        变化
#define ROUND  1     //生成50个随机序列             变化

#define N 20     //表示200个目标粒子可能对应的全部随机数
#define M 2000   //表示干扰粒子可能对应的全部随机数

int main()
{
  //FILE *fp = NULL;
  FILE * fp=fopen("E:\\fenbu.txt","wt");
   int rand_buff[NUMBER] = {0};    //若NUMBER八九千万甚至过亿长,必须加static,若不是不需加static;NUMBER加上1是为给换行符一个位置
  int rand_ret = 0;    //生成随机数赋值给rand_ret
  int char_arr1[N];
  int char_arr2[M];
  int mubiao_count = 0;
  int ganrao_count = 0;
  int mubiao_flag = 0;
  int ganrao_flag = 0;
  int i = 0, j = 0,h=0;


  
  for(i=0;i<N;i++)
  char_arr1[i]=i;   //给char_arr1[]字符数组赋值0-N间的数字
  
  for(i=0;i<M;i++)
  char_arr1[i]=i+N;   //给char_arr1[]字符数组赋值0-N间的数字


  fp = fopen("random", "a+");
  if(fp == NULL)
  {
    perror("fopen");
    return -1;
  }   

  srand(time(NULL));

  for(i = 0; i < ROUND; i++)
  {
    memset(rand_buff, 0, sizeof(rand_buff));   //memset()函数的作用是对结构体或数组最快地进行清零,因此这里是对char rand_buff[]数组清零
    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)+1);  //随机数赋值给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用来计数A和T的个数
          if(mubiao_count >= 200)      //0.6表示A和T占的总量    变化
            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_arr2[(rand_ret-N)%M];   //生成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",rand_buff[h]);
         printf("%d",rand_buff[h]);
    }
    //fwrite(rand_buff, sizeof(rand_buff), 1, fp);   //将生成的每一段随机序列写入fp文件
   
  }
  fprintf(fp,"\n");

  fclose(fp);
  return 0;
}
2016-09-06 09:34
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
回复 12楼 ehszt
    您好,这是最新的修改程序,输出有问题,严重偏离期望结果!
    谢谢!!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>  //常用于函数strlen、strcmp、strcpy等等
#include <time.h>

#define NUMBER 200200      //生成随机序列的长度        变化
#define ROUND  1     //生成50个随机序列             变化

#define N 200     //表示200个目标粒子可能对应的全部随机数
#define M 200000   //表示干扰粒子可能对应的全部随机数

int main()
{
  //FILE *fp = NULL;
  FILE * fp=fopen("E:\\fenbu.txt","wt");
   int rand_buff[NUMBER] = {0};    //若NUMBER八九千万甚至过亿长,必须加static,若不是不需加static;NUMBER加上1是为给换行符一个位置
  int rand_ret = 0;    //生成随机数赋值给rand_ret
  int char_arr1[N];
  int char_arr2[M];
  int mubiao_count = 0;
  int ganrao_count = 0;
  int mubiao_flag = 0;
  int ganrao_flag = 0;
  int i = 0, j = 0,h=0;


  
  for(i=0;i<N;i++)
  char_arr1[i]=i;   //给char_arr1[]字符数组赋值0-N间的数字
  
  for(i=0;i<M;i++)
  char_arr1[i]=i+N;   //给char_arr1[]字符数组赋值0-N间的数字


  fp = fopen("random", "a+");
  if(fp == NULL)
  {
    perror("fopen");
    return -1;
  }   

  srand(time(NULL));

  for(i = 0; i < ROUND; i++)
  {
    memset(rand_buff, 0, sizeof(rand_buff));   //memset()函数的作用是对结构体或数组最快地进行清零,因此这里是对char rand_buff[]数组清零
    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)+1);  //随机数赋值给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用来计数A和T的个数
          if(mubiao_count >= 200)      //0.6表示A和T占的总量    变化
            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_arr2[(rand_ret-N)%M];   //生成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",rand_buff[h]);
         printf("%d",rand_buff[h]);
    }
    //fwrite(rand_buff, sizeof(rand_buff), 1, fp);   //将生成的每一段随机序列写入fp文件
   
  }
  fprintf(fp,"\n");

  fclose(fp);
  return 0;
}
2016-09-06 09:36
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
    您好,lianyicq!
    正如我所解释的一样,n个红球在m个黑球(m>>n)的随机作用下,包含红球的的洞数势必要比无黑球作用下包含红球的洞数要多!
    从物理上讲,体系包含的粒子越多,粒子间的相互作用就会越均匀,这其实完全可以应用在上面的红球与黑球的情况。红球与黑球掺杂在一起(m>>n),促进了红球在整个体系内的均匀性(准确讲,红球与黑球整个体系都均匀了),因此,我才作此论断。
    希望共同讨论!望指教!!
    谢谢!!!
2016-09-06 13:23
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
红球和黑球间相互作用为零,再多的黑球也没有任何用处。你说的均匀性是指随着m的增大,Pi趋向于1/n?。
再举个列,更具体一些。

 
    您好!
    如果红球与黑球之间不存在相互作用,红球的分布规律正如您所计算的那样,无论黑球存在与否,不存在任何分布偏好性,全都一样!!
    但实际情况不是这样的,大量黑球的存在令红球的分布更加倾向于体系内的分布均匀性(由于红、黑球之间的相互作用造成),这种分布均匀性决定了每个红球倾向于进入某些孔洞。当然,这个过程并未改变每个红球入洞的随机性,因为红球均匀分布过程中每个红球的分布依旧是随机的,所以整个过程仍满足随机性。
    因此,在大量黑球存在情况下,包含红球的洞数要比黑球不存在时要多。
   
   
2016-09-06 14:39
快速回复:设定成分含量的随机数生成
数据加载中...
 
   



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

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