| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3362 人关注过本帖
标题:设定成分含量的随机数生成
只看楼主 加入收藏
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
结帖率:93.94%
收藏
已结贴  问题点数:30 回复次数:32 
设定成分含量的随机数生成
    请各位大侠帮忙,现纠结于如何生成规定成分含量的随机数!
    需要生成的随机数特点如下:
    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
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:0 
对于每个集合,就是生产200个在区间[0,200N]中的数,生成200000个在区间[200N+1,200200N]中的数嘛
难点在哪里,或者说你哪里不会?
2016-09-05 10:46
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
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:3 
回复 3楼 zhou31146001
1和2 我只当你没睡醒,你得在『数学』上先理清
3 我之前回答过你,不愿意看的话,我再敲一遍你还是不愿意看 https://bbs.bccn.net/thread-468271-2-1.html
2016-09-05 12:38
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
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1744
专家分:3216
注 册:2015-12-2
收藏
得分:12 
依照概率的说法,A生一个男孩的概率为50%。如果A前面四胎生的全是女孩,那么她第五胎生男孩的概率还是50%,丝毫不受前面四胎的影响。
有人说有生男孩的秘方可以提高生男孩的机率,这个有可能吗?依我看,除了做胎儿姓别鉴定,打胎,没有其它办法(违法事情不要做)
但无论如何怀男孩的机率还是50%。
2016-09-05 16:08
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
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1744
专家分:3216
注 册:2015-12-2
收藏
得分:0 
你这么说,也有这个可能。那你说说看,你程序出现什么问题?
2016-09-05 16:58
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
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1744
专家分:3216
注 册:2015-12-2
收藏
得分:0 
  for(i=0;i<N;i++)
   char_arr1[i]=i;  
你用整型数组不好吗?,一个字符变量大小为一个字节,而整型变量大小为4个字节,这样赋值会导致溢出的。
2016-09-05 17:41
快速回复:设定成分含量的随机数生成
数据加载中...
 
   



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

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