这个函数是纯的吗? (随机计算,确定性结果)
Is this function pure? (Random computation, deterministic result)
一个纯函数被定义为一个函数:
- Returns 相同参数的相同值,并且
- 不会产生任何副作用(非局部变量的变异、I/O 操作等)
考虑一个函数,该函数通过随机抽取介于 1 和两个数中最小值之间的整数来计算两个正整数的最大公约数,并确定抽取的整数是否能整除两个给定整数。当所有的整数都被访问过后,函数returns采样最高的整数。假设使用的随机数生成器是统一的。
直觉上,在我看来这个函数是纯,尽管它的计算是不确定的。它为相同的参数产生相同的值,并且不会产生任何副作用。我能想到的唯一可能 "side effect" 是,如果输入足够大,计算有可能永远进行下去。我将此函数标记为 pure 是否正确?
不,我不这么认为。
至于随机数生成器,有两种可能:
是一个Pseudo-RNG。这意味着它有一个 N-bit 状态,每次生成一个新的随机数时,状态都会更新。所以有一个副作用——RNG状态的改变。
一个真正的随机生成器,它从熵源中提取随机位。同样,池将被使用并且可能会耗尽 - 这是 non-pure 函数的标志。
A "random number generator" 不能是纯函数,除非它生成 random-looking 数字所需的所有信息都预先传递给它。如果生成器使用其他任何东西(例如系统时钟或文件系统),生成器将不是纯粹的。例如,纯函数包括:
- 哈希函数。
- 获取种子并输出 random-looking 数字和新种子的函数。
- 采用内部状态并输出 random-looking 数字和新内部状态的函数。
查看我的部分“Designs for PRNGs”。
一个纯函数被定义为一个函数:
- Returns 相同参数的相同值,并且
- 不会产生任何副作用(非局部变量的变异、I/O 操作等)
考虑一个函数,该函数通过随机抽取介于 1 和两个数中最小值之间的整数来计算两个正整数的最大公约数,并确定抽取的整数是否能整除两个给定整数。当所有的整数都被访问过后,函数returns采样最高的整数。假设使用的随机数生成器是统一的。
直觉上,在我看来这个函数是纯,尽管它的计算是不确定的。它为相同的参数产生相同的值,并且不会产生任何副作用。我能想到的唯一可能 "side effect" 是,如果输入足够大,计算有可能永远进行下去。我将此函数标记为 pure 是否正确?
不,我不这么认为。
至于随机数生成器,有两种可能:
是一个Pseudo-RNG。这意味着它有一个 N-bit 状态,每次生成一个新的随机数时,状态都会更新。所以有一个副作用——RNG状态的改变。
一个真正的随机生成器,它从熵源中提取随机位。同样,池将被使用并且可能会耗尽 - 这是 non-pure 函数的标志。
A "random number generator" 不能是纯函数,除非它生成 random-looking 数字所需的所有信息都预先传递给它。如果生成器使用其他任何东西(例如系统时钟或文件系统),生成器将不是纯粹的。例如,纯函数包括:
- 哈希函数。
- 获取种子并输出 random-looking 数字和新种子的函数。
- 采用内部状态并输出 random-looking 数字和新内部状态的函数。
查看我的部分“Designs for PRNGs”。