笔试巧用随机数

一个鸡贼的技巧,注意那些输出为「二值」的题目,二值就是类似布尔值,或者 0 和 1 这种组合有限的。

比如说很多题目是这样,巴拉巴拉给你说一堆条件,然后问你输入的数据能不能达成这些条件,如果能的话请输出 YES,不能的话输出 NO

如果你会做当然好,如果不会做怎么办?

首先这样提交一下:

print("YES")

看下 case 通过率,假设是 60%,那么说明结果为 YES 有 60% 的概率,所以可以这样写代码:

import random
def number_of_certain_prob(seq, prob):
    x = random.uniform(0, 1)
    cumulative_prob = 0.0
    for item, item_prob in zip(seq, prob):
        cumulative_prob += item_prob
        if x < cumulative_prob:
            break
    return item

if __name__ == '__main__':
    # 测试代码
    seq = ["yes", "no"]
    prob = [0.6, 0.4]
    res = number_of_certain_prob(seq, prob)
    print(res)

验证如下

if __name__ == '__main__':
    # 测试代码
    seq = ["yes", "no"]
    prob = [0.6, 0.4]
    a = 0
    b = 0
    repeat = 100000
    for i in range(repeat):
        result = number_of_certain_prob(seq, prob)
        if result == "yes":
            a = a + 1
        elif result == "no":
            b = b + 1
    
    print(a / repeat)
    print(b / repeat)

输出:

0.60252
0.39748

参考:

  1. 关于算法笔试,labuladong 说点套路
  2. Python以一定的概率生成某个数