zoukankan      html  css  js  c++  java
  • poj 2727 Expectation

    新文章移至   

    http://cffile.sinaapp.com/?p=33

     

    如果有两个随机数生成器A,B(生成数都小于输入值)
    例如n=3;
    A 000 001 010
    B 000 001 010
    两者再随机异或生成的3*3=9个数进行期望计算...
    计算结果:
    *** 000 001 010
    000 000 001 010
    001 001 000 011
    010 010 011 000
    求期望得到4/3.
    由于数量庞大 10^9 直接模拟一定超时
    所以直接计算每一位的 0 1 个数可以简化计算量
    条件一:在异或中,只要两个位不同0 1或1 0 就能得到1
    条件二:计算每一位的0 1出现的个数,例如上面,最低位(假设i为二进制权,i=1)1出现1次,
    0出现3-1次所以表中得到最低位是1的个数就是1*2+2*1=4个,所以这一位贡献的期望值
    是(1*2+2*1)*i/(3*3)=4/9;如此计算第二位,1出现1次,同样贡献期望值为(1*2+2*1)*i/(3*3)=8/9,
    此时(i=2);第三为i=4....
    只要算出产生数中每一位的0 1个数k代入
    2*(k*(n-k))*i/(n*n) ==> 2*p*(1-p)*i  其中 p=(n-k)/n  表示 0在该位出现的概率...



    #include <stdio.h>
    int main()
    {
        int t,i,n,s;
        double r,p;
        scanf("%d",&t);
        while(t--){
            scanf("%d",&n);
            r=0;
            for(i=0;i<32;i++){
                s=1<<i;
                p=((n/s>>1)*s + (((n&s)==0)?n%s:s))  /(double)n;
                //第i位为0分为两部分,1.该数比n至少少1位,第i位确定0的个数 (n/s>>1)*s 可以理解为 (n/2/s)  *s ,前i位可以任意,即s种可能
                //2.该数与n 位数相同 ((n&s)==0)?n%s:s)可以理解为 如果第i位为1,则情况有s种,如果第i位为0,则只有n%s种
                //加起来的和就是第i位 0 的个数了
                r+= 2*p*(1-p)*s;
            }
            printf("%.2lf\n",r);
        }
        return 1;
    }

  • 相关阅读:
    一个很简单的脑筋急转弯问题
    DataGrid PCV排序学习
    VS2010 出现打开关联文档错误的解决方案
    JS 简繁体互转代码
    js 常用正则表达式表单验证代码
    【转】自然语言处理(NLP)网上资源整理
    声卡编程讲解
    视频会议1
    转 语音处理资源
    编译WebRTC
  • 原文地址:https://www.cnblogs.com/chenzhihong/p/2087779.html
Copyright © 2011-2022 走看看