| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3358 人关注过本帖
标题:设定成分含量的随机数生成
只看楼主 加入收藏
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
回复 10楼 ehszt
    您好!
    还是存在小的问题!
    不能正常输出!!
    谢谢!!
2016-09-05 19:03
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1744
专家分:3216
注 册:2015-12-2
收藏
得分:0 
改好的代码贴上来。
2016-09-05 19:47
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
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1744
专家分:3216
注 册:2015-12-2
收藏
得分:0 
回复 14楼 zhou31146001
   for(i=0;i<N;i++)
   char_arr1[i]=i;   
  
   for(i=0;i<M;i++)     /*char_arr1最大小标为N,你这里能到M*/
   char_arr1[i]=i+N;   
改成一个不就好了
for(i=0;i<M+N;i++)
char_arr1[i]=i;
再把char_arr1的最大下标定为M+N
2016-09-06 10:27
lianyicq
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:26
帖 子:737
专家分:3488
注 册:2013-1-26
收藏
得分:5 
回复 7楼 zhou31146001
    您好!
    我们这么想:
    200个目标粒子随机落入200个洞,经我的模拟计算,包含目标粒子的洞数的主峰值/最大值在127左右!
    现在,我们另200个目标粒子与20000个干扰粒子随机的掺在一起,这时令全部粒子随机的落向200个洞,我坚信这时包含目标粒子的洞数的主峰值/最大值绝对远大于127
    因为,众多干扰粒子与目标粒子之间具有随机的相互作用,这种随机相互作用增强了目标粒子的自平均性,使目标粒子在干扰粒子的作用下将分布的更加均匀,于是包含目标粒子的洞数的主峰值/最大值绝对远大于127。
    因此,我敢说,随机生成1000组介于[0-200]之间的随机数(每组含200个随机数),与随机生成1000组介于[0-20200]之间的随机数(每组含20200个随机数),其中0-200的出现分布情况在两种条件下绝对存在差异。因此,我认为,这其实是有意义的,至少从模拟计算方面来讲。
    请赐教!!
    另外,大侠,请指教一下,我的程序到底错在哪了,这让我很纠结!!
------------------------------------------------------------------------------------
楼主确实该纠结。写的代码都是关于随机数的,不知楼主对概率论和数理统计掌握多少?

我帮你把问题归纳如下:n个红球入n个洞,分别求得所有红球入1~n个洞的概率,假设这个概率为P1~Pn。现在有n个红球加m个黑球(m>>n)入n个洞,分别求得所有红球入1~n个洞的概率,假设概率为Q1~Qn。想要证明Pi<>Qi(i=1~n)。
知道了基本的独立事件,这本不需要证明。
如果一定要用实验验证,也是好事。参照我以前回过贴子的代码,修改一下。区别在于n个红球随机分布于1~n+m中。

大开眼界
2016-09-06 11:25
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
    您好,lianyicq!
    正如我所解释的一样,n个红球在m个黑球(m>>n)的随机作用下,包含红球的的洞数势必要比无黑球作用下包含红球的洞数要多!
    从物理上讲,体系包含的粒子越多,粒子间的相互作用就会越均匀,这其实完全可以应用在上面的红球与黑球的情况。红球与黑球掺杂在一起(m>>n),促进了红球在整个体系内的均匀性(准确讲,红球与黑球整个体系都均匀了),因此,我才作此论断。
    希望共同讨论!望指教!!
    谢谢!!!
2016-09-06 13:23
lianyicq
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:26
帖 子:737
专家分:3488
注 册:2013-1-26
收藏
得分:0 
    您好,lianyicq!
    正如我所解释的一样,n个红球在m个黑球(m>>n)的随机作用下,包含红球的的洞数势必要比无黑球作用下包含红球的洞数要多!
    从物理上讲,体系包含的粒子越多,粒子间的相互作用就会越均匀,这其实完全可以应用在上面的红球与黑球的情况。红球与黑球掺杂在一起(m>>n),促进了红球在整个体系内的均匀性(准确讲,红球与黑球整个体系都均匀了),因此,我才作此论断。
    希望共同讨论!望指教!!
    谢谢!!!

红球和黑球间相互作用为零,再多的黑球也没有任何用处。你说的均匀性是指随着m的增大,Pi趋向于1/n?。
再举个列,更具体一些。
图片附件: 游客没有浏览图片的权限,请 登录注册

大开眼界
2016-09-06 14:07
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
红球和黑球间相互作用为零,再多的黑球也没有任何用处。你说的均匀性是指随着m的增大,Pi趋向于1/n?。
再举个列,更具体一些。

 
    您好!
    如果红球与黑球之间不存在相互作用,红球的分布规律正如您所计算的那样,无论黑球存在与否,不存在任何分布偏好性,全都一样!!
    但实际情况不是这样的,大量黑球的存在令红球的分布更加倾向于体系内的分布均匀性(由于红、黑球之间的相互作用造成),这种分布均匀性决定了每个红球倾向于进入某些孔洞。当然,这个过程并未改变每个红球入洞的随机性,因为红球均匀分布过程中每个红球的分布依旧是随机的,所以整个过程仍满足随机性。
    因此,在大量黑球存在情况下,包含红球的洞数要比黑球不存在时要多。
   
   
2016-09-06 14:39
lianyicq
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:26
帖 子:737
专家分:3488
注 册:2013-1-26
收藏
得分:0 
但实际情况不是这样的,大量黑球的存在令红球的分布更加倾向于体系内的分布均匀性(由于红、黑球之间的相互作用造成),这种分布均匀性决定了每个红球倾向于进入某些孔洞。当然,这个过程并未改变每个红球入洞的随机性,因为红球均匀分布过程中每个红球的分布依旧是随机的,所以整个过程仍满足随机性。
    因此,在大量黑球存在情况下,包含红球的洞数要比黑球不存在时要多

实际情况是怎么来的?是某个理论还是谁做实验?
最后的结论不对。无论有没有黑球,包含红球的洞数可能是1~n的任何数,只是概率不同。而只有大量重复实验的计算结果才趋近于理论计算。
   

大开眼界
2016-09-06 15:33
快速回复:设定成分含量的随机数生成
数据加载中...
 
   



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

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