zoukankan      html  css  js  c++  java
  • 关于随机数的一道面试题

    去一家IT公司面试,当时面试官问的,可惜没出来,后来上网搜了一下,找到了解决方案,

    问题:已知随机数函数rand5(),可以均匀随机生成1~5,编写随机函数rand7(),可以随机生成1~7,并且保持均匀性。

    当时,想的是rand5()+ rand5()%3,但是这样是无法保证期均匀性的。后来上网找到了一个解决办法:利用rand5()等概率随机生成1~25,然后去掉22~25,最后将结果%7+1,就等到等概率分布的1~7

    代码:

    int rand5();
    
    int rand7(){
       int rst = 0;
       do{
          rst = (rand5()-1)*5 + rand5();
       }while(rst > 21);
       return rst %7 + 1;
    }

    首先解释为什么(rand5()-1)*5+rand5()可以等概率的生成1~25,因为这就好比,将1~25这一列,分成5个slot,每个slot里面有5个items,(rand5()-1)*5这部分相当于,分别访问5个slot的,然后rand5()是访问该slot内的item,用于访问slot,以及其中的item概率都是1/5,所以,这样就产生了1~25等概率的随机数。

    还有一个问题就是,为什么在大于21的时候截断,而不是直接大于7的时候截断,最后直接返回呢?因为如果在大于7的时候截断,这样程序进入循环的概率(25-7)/25,在大于21的时候截断,程序进入循环的概率降低。

  • 相关阅读:
    03.yaml语法和playbook写法
    02.ansible的常用模块
    01.ansible基本配置与使用
    24.删除表名
    23.MySQL的备份与恢复
    22.更改表名
    MySQL的表操作
    MySQL的库操作
    MySQL的用户管理
    数据库及MySQL概述
  • 原文地址:https://www.cnblogs.com/suiyu/p/3972999.html
Copyright © 2011-2022 走看看