zoukankan      html  css  js  c++  java
  • 470.Implement Rand10() Using Rand7()

    Given a function rand7 which generates a uniform random integer in the range 1 to 7, write a function rand10 which generates a uniform random integer in the range 1 to 10.

    Do NOT use system's Math.random().

    Example 1:

    Input: 1
    Output: [7]

    Example 2:

    Input: 2
    Output: [8,4]

    Example 3:

    Input: 3
    Output: [8,1,10]

    Note:

    1. rand7 is predefined.
    2. Each testcase has one argument: n, the number of times that rand10 is called.

    Follow up:

    1. What is the expected value for the number of calls to rand7() function?
    2. Could you minimize the number of calls to rand7()?
    # The rand7() API is already defined for you.
    # def rand7():
    # @return a random integer in the range 1 to 7
    
    class Solution:
        def rand10(self):
            """
            :rtype: int
            """
            x = 0
            while True:
                x = (rand7()-1)*7+rand7()
                if x<=40:
                    break
            return x%10 + 1
    

    首先rand7()-1得到一个离散整数集合{0,1,2,3,4,5,6},其中每个整数的出现概率都是1/7。那么(rand7()-1)7得到一个离散整数集合A={0,7,14,21,28,35,42},其中每个整数的出现概率也都是1/7。而rand7()得到的集合B={1,2,3,4,5,6,7}中每个整数出现的概率也是1/7。显然集合A和B中任何两个元素组合可以与1-49之间的一个整数一一对应,也就是说1-49之间的任何一个数,可以唯一确定A和B中两个元素的一种组合方式,反过来也成立。由于A和B中元素可以看成是独立事件,根据独立事件的概率公式P(AB)=P(A)P(B),得到每个组合的概率是1/71/7=1/49。因此(rand7()-1)*7+rand7()生成的整数均匀分布在1-49之间,每个数的概率都是1/49。
    然后的思路基于拒绝采样,若x<=40,则直接采用其mod10+1的结果。若不再这个区间内,则重复采样,直到落在这个区间里。

  • 相关阅读:
    THUWC2020 游记
    USACO14MAR The Lazy Cow(Gold)
    luogu P3768 简单的数学题
    2017/9/22模拟赛
    2017/9/20模拟赛
    2017/9/15模拟赛
    刷屏代码·稳 from林凯
    2017/9/13模拟赛
    【9018:1368】八数码
    2017/9/10模拟赛
  • 原文地址:https://www.cnblogs.com/bernieloveslife/p/9757739.html
Copyright © 2011-2022 走看看