| 网站首页 | 业界新闻 | 群组 | 交易 | 人才 | 下载频道 | 博客 | 代码贴 | 编程论坛
大量收QQ微信精准粉/交友粉,非诚勿扰千里之行 始于足下
共有 1640 人关注过本帖
标题:设定成分含量的随机数生成
只看楼主 加入收藏
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:301
专家分:131
注 册:2012-11-28
  得分:0 
    您好,lianyicq!
    没错,无论黑球存在与否,包含红球的洞数可能是1~n的任何数。
    无黑球存在时,对应1-n的概率分别为P1—Pn;但黑球存在时,对应1-n的概率分别为p1-pn,但p1-pn与P1-Pn已不再对应相等。   
2016-09-06 16:22
lianyicq
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:26
帖 子:735
专家分:3478
注 册:2013-1-26
  得分:0 
实际情况是怎么来的?是某个理论还是谁做实验?
就按3红入3洞、3红30000黑入3洞。 如何证明不等?

大开眼界
2016-09-06 16:27
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:城市猎人
威 望:9
帖 子:1061
专家分:5089
注 册:2015-10-27
  得分:0 
回复 19楼 zhou31146001
请你注意一件事,你说
模拟1000次,200个球进200个洞的实验结果 和 模拟1000次,200200个球进200200个洞的结果不一样,所以你认为看似没用的干扰因子是可以起到辅助均衡目标因子的作用

 前者的随机程度达到1000/200,而后者才1000/200200,后者显然不是可以参考的随机试验。如果不信,你可以试试看模拟1000次2个球进2个洞的实验,和1000次20个球进20个洞的实验,你就会发现,因为随机次数/随机主体的比例上升,实验结果会越发接近公式计算出来的结果。。。

你还记得不那个“掷针平行线相交”实验?那个老先生请了多少人,做了多少次实验,最后得到的数据不也仅仅是接近计算结果。

对随机这件事请做实验,本身就是不靠谱的事,做再多次也只有参考意义,不能得出任何绝对的成果。就像前面有人提到的 “前3胎生女儿,第四胎生儿子的几率依然是50%”一样,现在我们假设某人前99胎生了女儿,第100胎生儿子的概率你觉得会是多少?那么假设我们统计了人类有史以来所有的记录都没找到一个连续生了100胎女儿的案例,是不是就能说这个人第100胎生女儿的概率会比较小呢?
随机本身是绝对不受不相关信息的干扰的(就好像六合彩的数字一样,你统计个十年二十年的数据也依然得不出特别均衡的分布,但你能说它不公平吗?不能吧)。随机是数学,是公式,但和实际生活中的现象不是绝对相等的。否则两百年后,云计算能力再翻上几个兆次方,就真的会有计算机可以计算命运了,不是吗?

牛顿晚年开始认为世间有神明,不就是因为他发觉世界上还有很多当时数学所不能解释的巧合,转而认为这一切的背后会有一只手在操控。







[此贴子已经被作者于2016-9-6 18:38编辑过]


φ(゜▽゜*)♪
2016-09-06 18:28
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:301
专家分:131
注 册:2012-11-28
  得分:0 
    大家好!
    你好,书生牛犊!
    模拟过程是:
    模拟1000次,200个球进200个洞的实验结果;模拟1000次,200个球在200000个干扰球作用下进200个洞的实验结果。
    虽然大家都不赞同我的理解,但和大家分享交流也是受益匪浅的。
    我还是比较坚持我的理解,除非我模拟完成的结果不是我想要的,而是大家所说的。
    目前我的程序出现了问题,我恳求大家先帮我解决这个问题,待我得到模拟结果后,我同样会把结果发在这个帖里,作为每个人观点的主要论据!!
   
    程序现在很奇怪,当NUMBER设为200200时,程序就无法运行,出现下面的结果:

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

    一旦我令NUMBER为20020(小于200200),程序就可以运行,且输出正常结果。
    这究竟是为什么,请各位大侠搁置争议,麻烦帮我解决这个问题,非常感谢!!!!!

    #include <stdio.h>
#include <stdlib.h>
#include <string.h>  //常用于函数strlen、strcmp、strcpy等等
#include <time.h>

#define NUMBER 200200      //生成随机数的长度,或每NUMBER个数统计一次        修改(仅目标粒子:干扰粒子比值变化时修改)
#define ROUND  10     //生成50个随机序列            

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

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 char_arr1[M+N];
 
  int mubiao_count = 0;
  int ganrao_count = 0;    //整数型占4个字节,字符型占1个字节,当将整数赋值给字符数组时会引起溢出,无法运行程序;字符型数组必须以"\0"结尾
  int mubiao_flag = 0;
  int ganrao_flag = 0;
  int i, j,h,k;


  
  for(i=0;i<(M+N);i++)
  char_arr1[i]=i;   //给char_arr1[]字符数组赋值0-N间的数字
  
  
 
  //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] = char_arr1[rand_ret%N];  //rand_ret介于1-6间,该行通过char_arr1[0]=A和char_arr1[1]=T来随机生成A和T
          mubiao_count++;   //AT_count用来计数随机数的个数,确保指定随机数的含量
          if(mubiao_count >= (N/P))      //    变化
            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_arr1[(rand_ret)%(M+N)];   //生成C和G
          ganrao_count++;
          if(ganrao_count >= (M/P))       //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-09-07 09:37
lianyicq
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:26
帖 子:735
专家分:3478
注 册:2013-1-26
  得分:0 
回复 24楼 zhou31146001
模拟1000次,200个球进200个洞的实验结果;模拟1000次,200个球在200000个干扰球作用下进200个洞的实验结果。

验证是好事。但你这实验方法能行?
200个球进200个洞有200的200次方种放法。更不用说200的200200次方了。而你仅有1000次去验证?

大开眼界
2016-09-07 09:49
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:301
专家分:131
注 册:2012-11-28
  得分:0 
回复 25楼 lianyicq
  你好!
  我只验证包含红球的总洞数,1000次足矣!!
  
  另外打搅一下,请问程序问题出在了哪??
  非常感谢!!
2016-09-07 10:08
lianyicq
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:26
帖 子:735
专家分:3478
注 册:2013-1-26
  得分:0 
夯实基础吧,其它的我帮不忙了。

大开眼界
2016-09-07 10:13
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:城市猎人
威 望:9
帖 子:1061
专家分:5089
注 册:2015-10-27
  得分:10 
回复 24楼 zhou31146001
实现从【0,200200】的随机数方法,前面已经有人讲过了。不过大约你还没理解(我也不太理解,那位的思路是随机一个0到n的数字,然后/N*200200)

我的想法就是转化成随机【0-2002】和【0-99】,当然要加上冲突处理的部分。

程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

void fun1(int sum[][200]){//更正fun1如下,之前的随机逻辑出错了
    int red=200,black=200200;

    for(int j=1000; j; j--) {
        for(int i=200200; i; i--) {
            int flag=rand()*1.0/RAND_MAX*(red+black);
            if(flag<red){//随机到了一个红球
                sum[j][rand()%200]++;//随机一个洞入洞
                red--;
            }else black--;
        }
//        for(int i=0; i<200; i++)printf("%4d",sum[i]);
//        printf("\n");
    }
}
void fun2(int sum[][200]){
    for(int j=1000; j; j--) {
        for(int i=200; i; i--) {
            int flag=rand()%200;
            sum[j-1][flag]++;
        }
//        for(int i=0; i<200; i++)printf("%4d",sum[i]);
//        printf("\n");
    }
}

int main() { //我在本地运行超时

    srand(time(NULL));
    int start=0;
    start=clock();
    int sum[1000][200]={0};

    fun2(sum);
    //计算峰值的部分你打算怎么做这个我就不会了。
    for(int i=0;i<1000;i++)for(int j=0;j<200;j++)sum[i][j]=0;//重置

    fun1(sum);
    //计算峰值

    int end=clock();  
printf("%d",end-start);//计算耗时的一个函数,不过我没想到数据量这么大居然只花了5.6秒就搞定

    return 0;
}

计算机的随机数函数本身其实是一张固定的表,所以在使用的时候通常会加手段辅助。上面的程序我没加辅助手段,我比较担心会不会超时。我刚学编程没多久,不太会看别人额程序,喜欢按照自己的思路写。希望没有理解错你的需求



[此贴子已经被作者于2016-9-7 13:02编辑过]


φ(゜▽゜*)♪
2016-09-07 10:28
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:301
专家分:131
注 册:2012-11-28
  得分:0 
   你好!
   1、即便我改成了每次生成10组【0,200200】之间的随机数,同样无法生成,即使生成1组也是这种情况!
   2、冲突处理怎么调解?
   3、我的程序只用了一次随机,两次随机可实现穿插生成。
   
2016-09-07 10:56
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:城市猎人
威 望:9
帖 子:1061
专家分:5089
注 册:2015-10-27
  得分:0 
回复 29楼 zhou31146001

rand_ret = (rand()*(RAND_MAX+1) + rand())%(M+N);  //随机数赋值给rand_set
rand() 返回 0 到 RAND_MAX 之间的伪随机**整数**.所以你这个rand_set=rand()*Rand_MAX...是个很奇怪的东西。从逻辑上我完全不能理解。我怀疑是不是相乘得到的数字太大了?通常情况,rand()%SIZE得到[0,SIZE)的随机整数数,要得到小数就得自己另外做除法之类的。
程序代码:
void fun1(int sum[][200]){//更正fun1如下,之前的随机逻辑出错了
    int red=200,black=200200;

    for(int j=1000; j; j--) {
        for(int i=200200; i; i--) {
            int flag=rand()*1.0/RAND_MAX*(red+black);//rand()得到一个【0,RAND_MAX】,除于RAND_MAX得到【0,1】的小数乘以剩下的球的总数得到一个随机值
            if(flag<red){//如果得到的随机值小于当前红球的剩余数目,则随机到了一个红球
                sum[j][rand()%200]++;//再次随找机一个洞  入洞
                red--;
            }else black--;
        }
//        for(int i=0; i<200; i++)printf("%4d",sum[i]);
//        printf("\n");
    }
}

还有,我不明白你的程序当中为什么会有字符数组,如果你是用来保存这个随机数的话,希望你能考虑一下字符只占内存中的一个字节,他的数值上限是2^8=256,200200已经严重溢出了


对于你说的 程序现在很奇怪,当NUMBER设为200200时,程序就无法运行,出现下面的结果:  从整篇代码来看,NUMBER只出现了一次,我怀疑是int ??【NUMBER】的时候空间不足,导致程序崩溃退出。你要一个这么长的连续的空的内存空间,干嘛用?。


[此贴子已经被作者于2016-9-7 13:01编辑过]


φ(゜▽゜*)♪
2016-09-07 12:03







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

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