这个函数是纯的吗? (随机计算,确定性结果)

Is this function pure? (Random computation, deterministic result)

一个纯函数被定义为一个函数:

  1. Returns 相同参数的相同值,并且
  2. 不会产生任何副作用(非局部变量的变异、I/O 操作等)

考虑一个函数,该函数通过随机抽取介于 1 和两个数中最小值之间的整数来计算两个正整数的最大公约数,并确定抽取的整数是否能整除两个给定整数。当所有的整数都被访问过后,函数returns采样最高的整数。假设使用的随机数生成器是统一的。

直觉上,在我看来这个函数是,尽管它的计算是不确定的。它为相同的参数产生相同的值,并且不会产生任何副作用。我能想到的唯一可能 "side effect" 是,如果输入足够大,计算有可能永远进行下去。我将此函数标记为 pure 是否正确?

不,我不这么认为。

至于随机数生成器,有两种可能:

  1. 是一个Pseudo-RNG。这意味着它有一个 N-bit 状态,每次生成一个新的随机数时,状态都会更新。所以有一个副作用——RNG状态的改变。

  2. 一个真正的随机生成器,它从熵源中提取随机位。同样,池将被使用并且可能会耗尽 - 这是 non-pure 函数的标志。

A "random number generator" 不能是纯函数,除非它生成 random-looking 数字所需的所有信息都预先传递给它。如果生成器使用其他任何东西(例如系统时钟或文件系统),生成器将不是纯粹的。例如,纯函数包括:

  • 哈希函数。
  • 获取种子并输出 random-looking 数字和新种子的函数。
  • 采用内部状态并输出 random-looking 数字和新内部状态的函数。

查看我的部分“Designs for PRNGs”。