随机性在计算机科学中的最初应用之一就是随机算法。随机算法是能够获得随机性来源(比如随机数生成器)的算法,它允许在很小的概率内出错。目前已经有许多问题我们知道怎样用随机算法高效地求解,而并不知道怎样用确定性算法(即不使用随机性的算法)高效求解。事实上,计算机科学中最重要的open problems之一就是询问每个高效的随机算法是否都有其对应求解相同问题的确定性算法。
下面是个简单的随机算法例子:
import numpy as np
def f(x):
y = np.random.binomial(1, 0.5)
if y == 0:
while x > 0:
print("What up?")
x -= 1
return x + y对于一个确定的输入(比如x=3),其输出可能会有差异,且其运行时间也可能有差异。那么对于一个随机算法,我们如何度量其正确性(correctness)和运行时间(running time)呢?事实上,如果我们要求它输出结果总是正确的,且运行时间总是O(T(n)),则它就是时间复杂度为T(n)的确定性算法了。
因此,对于随机算法它要么不是在所有情况下总是正确的,要么就不能保证运行时间总为O(T(n)),它可以看做是在正确性和运行时间之间做赌博(gamble)。
2 蒙特卡洛算法和拉斯维加斯算法
[1] CMU 15-251: Great Ideas in Theoretical Computer Science: Lecture 19: Randomized Algorithms
[2] Mitzenmacher M, Upfal E. Probability and computing: Randomization and probabilistic techniques in algorithms and data analysis(M). Cambridge university press, 2017.