zoukankan      html  css  js  c++  java
  • 利用rand7()构造rand10()

    题意

    已知有个rand7()的函数,返回1到7随机自然数,让利用这个rand7()构造rand10() 随机1~10

    参考代码

    int rand7()
    {
        srand((int)time(NULL)); //参考
        return rand()%7 + 1;
    }
    int rand10()
    {
        int x;
        do 
        {
            x = (rand7()-1) * 7 + rand7();
        }while(x > 40);
        return x % 10 + 1;
    }

    解析

    要保证rand10()均匀生成1~10的随机数,可以构造一个0~10n的随机数区间,这样通过rand10n()%10+1就是所求。

    现在目标转移到生成rand10n()。如果不能生成正好rand10n(),可以通过生成rand10n+m()通过舍弃多余的m来获得rand10n()。

    现在目标转移到生成rand10n+m()。

    一个可行的方法

    rand7()               得到随机数{1,2,3,4,5,6,7}
    rand7()-1             得到随机数{0,1,2,3,4,5,6}           -------集合A
    (rand7()-1)*7         得到随机数{0,7,14,21,28,35,42}      -------集合B                        
    (rand7()-1)*7+rand7() 得到随机数{0,7,14,21,28,35,42}+{1,2,3,4,5,6,7}
    

    由于A和B中元素可以看成是独立事件,根据独立事件的概率公式P(AB)=P(A)P(B),得到每个组合的概率是1/7*1/7=1/49,生成概率集合为1~49。

  • 相关阅读:
    Python推导式(Comprehension)
    mysql中文乱码
    入门学习hibernate
    什么是ORM?
    Java网站中的权限管理
    Java的8中基本数据类型
    Python获取文件夹大小
    Python技巧
    Python中取整的方法floor,ceil,round
    Python线程join和setDaemon
  • 原文地址:https://www.cnblogs.com/kaituorensheng/p/3970452.html
Copyright © 2011-2022 走看看