将生成1-5随机数函数转换为1-7随机数函数的实现方法
代码
def demoP():
def _target():
"""
随机1-5的等值函数
:return:
"""
import random
return int(random.random() * float(5)) + 1
def f1():
"""
将1-5转换成 0 1 等值
12 为 0 45 为 1 3 循环
:return:
"""
while 1:
target = _target()
if target != 3:
break
return 0 if target < 3 else 1
def f2():
"""
将 01 等P 换成 二进制位 ==> 000 111 等概率
3个二进制位满足 0-7 八个数 等概率
:return:
"""
return (f1() << 2) + (f1() << 1) + (f1())
def f3():
"""
0-6 等概率返回
:return:
"""
while 1:
target = f2()
if target != 7:
break
return target
return f3() + 1
思路
- 将 1-5 的等P随机函数 改造成 0 1 等P函数
如原题中1-5等P函数,改成原函数输出12视为输出1,原函数输出45视为输出0,输出为3就在循环一次,既偶个数的等P函数就对半分,奇个数的等P函数就留出一个中间数做二次循环。
-
将改造后的01等P函数转化为二进制 来输出对应值 如满足7个随机数的输出正好就是3位二进制 数就可
000 -> 0+0+0 =0
001 -> 0+0+1 =1
010 -> 0+2+0 =2
011 -> 0+2+1 =3
100 -> 4+0+0 =4
101 -> 4+0+1 =5
110 -> 4+2+0 =6
110 -> 4+2+1 =7
-
如题目最后要生成1-7等P随机函数,则参考步骤1,将输出0 或者输出7的循环,其他输出,若输出7抹掉循环则最后加1
衍生
当面试题目为已经有a-b 的等P随机函数需要生成x-y 的等P随机函数:
- 将 a-b 的个数 对半均分
b-a+1/2 然后做成 01 等P随机函数 - 将 x-y 换成 由
二进制 表达的 0-(y-x) 的等P随机函数 - 将表达的
0-(y-x) 的等P随机函数 返回值 + x 就变成了x-y的等P随机函数
|