Expand a random range from 1–5 to 1–7

前端 未结 30 3122
一个人的身影
一个人的身影 2020-11-22 07:29

Given a function which produces a random integer in the range 1 to 5, write a function which produces a random integer in the range 1 to 7.

  1. What is a simple so
30条回答
  •  自闭症患者
    2020-11-22 08:33

    rand7() = (rand5()+rand5()+rand5()+rand5()+rand5()+rand5()+rand5())%7+1
    

    Edit: That doesn't quite work. It's off by about 2 parts in 1000 (assuming a perfect rand5). The buckets get:

    value   Count  Error%
    1       11158  -0.0035
    2       11144  -0.0214
    3       11144  -0.0214
    4       11158  -0.0035
    5       11172  +0.0144
    6       11177  +0.0208
    7       11172  +0.0144
    

    By switching to a sum of

    n   Error%
    10  +/- 1e-3,
    12  +/- 1e-4,
    14  +/- 1e-5,
    16  +/- 1e-6,
    ...
    28  +/- 3e-11
    

    seems to gain an order of magnitude for every 2 added

    BTW: the table of errors above was not generated via sampling but by the following recurrence relation:

    p[x,n] is the number ways output=x can happen given n calls to rand5.

      p[1,1] ... p[5,1] = 1
      p[6,1] ... p[7,1] = 0
    
      p[1,n] = p[7,n-1] + p[6,n-1] + p[5,n-1] + p[4,n-1] + p[3,n-1]
      p[2,n] = p[1,n-1] + p[7,n-1] + p[6,n-1] + p[5,n-1] + p[4,n-1]
      p[3,n] = p[2,n-1] + p[1,n-1] + p[7,n-1] + p[6,n-1] + p[5,n-1]
      p[4,n] = p[3,n-1] + p[2,n-1] + p[1,n-1] + p[7,n-1] + p[6,n-1]
      p[5,n] = p[4,n-1] + p[3,n-1] + p[2,n-1] + p[1,n-1] + p[7,n-1]
      p[6,n] = p[5,n-1] + p[4,n-1] + p[3,n-1] + p[2,n-1] + p[1,n-1]
      p[7,n] = p[6,n-1] + p[5,n-1] + p[4,n-1] + p[3,n-1] + p[2,n-1]
    

提交回复
热议问题