zoukankan      html  css  js  c++  java
  • 算法导论笔记:05随机问题

    4:用RANDOM(0,1)实现RANDOM(ab)

           这道题的实现思路:这个题目相当于在能随机生成 0, 1 的前提下,要求随机生成 n=b-a+1 个整数。      

           1、把要生成的数标记为 a, a+1, a+2,..., b-a+1,…,b-1,b      

           2取最小的 m,使得2^m >= n       

           3、通过随机生成 0,1 的函数生成一个   m 比特整数(随机生成每一位),这样能随机生成[0, 2^m)内的整数。      

           4、随机生成一个 [0,2^m) 中的整数,如果这个数加a大小在 [a, b] 内,则取这个数为结果。如果这个数加a在 [a, b] 外,则丢弃它,重新生成一个。

     

    int getBit(int a,int b)             

    {                                    

           int n = b - a + 1;      //n表示个数         

           int bit = 0;                     

           int value = 1;        //value = 2^bit           

                                          

           while (value < n)                

           {                                

                  bit++;                       

                  value = value << 1;          

           }                                

                                         

           return bit;                      

    }                                    

                                          

    int random_a_b(inta, int b)         

    {                                    

           int bit = getBit(a, b);          

                                         

           int flag;                        

           int result = 0;                  

           while (true)                     

           {                                

                  for (int i = 0; i < bit; i++)

                  {                            

                         flag = random_0_1();     

                         flag = flag << i;        

                         result |= flag;          

                  }                            

                                         

                  if (result + a > b)          

                  {                            

                         result = 0;              

                         continue;                

                  }                            

                  else                         

                         break;                   

           }                                

                                         

           return result + a;               

    }         

     

           5random(0,1)以概率p返回0,以概率(1-p)返回1。基于它实现random2(0,1),各以1/2的概率返回01.

    while(true)
    {
           x=random(0, 1);
           y=random(0, 1);
           if(x != y)
           return x;
    }

           该算法,只有在(x,y) = (1,0)或者(0,1)的情况下,才会返回,返回值为第一个数,因为用random(0,1)生成(1,0)或者(0,1) 的概率为p(1-p),两者生成的概率是相同的,所以,返回1和返回0的概率分别为1/2。第一题类似的原理,函数内部,用random(0,1)生成[0,b-a+1]中每个数的概率都是1/ 。所以,生成[0,b-a+1]中每个数的概率是相同的,因而返回每一个数的概率也是相同的。

  • 相关阅读:
    SQL server多表联合查询
    Linux at命令
    git用法总结详细
    vue插槽
    vue组件通信
    vue高阶函数
    vue过滤器
    vue侦听器watch
    Vue 计算属性 computed
    Spring事务失效的场景
  • 原文地址:https://www.cnblogs.com/gqtcgq/p/7247243.html
Copyright © 2011-2022 走看看