这个功能纯吗? (随机计算,确定性结果)

时间:2019-07-04 23:52:23

标签: random functional-programming deterministic purely-functional

纯功能定义为以下功能:

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

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

直观上,在我看来,此函数是 pure ,尽管其计算是不确定的。它为相同的参数产生相同的值,并且不会产生任何副作用。我能想到的唯一可能的“副作用”是,在输入足够大的情况下,计算可能会永远进行下去。我可以正确标记此功能 pure 吗?

2 个答案:

答案 0 :(得分:3)

不,我不这么认为。

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

  1. 这是伪RNG。这意味着它具有N位状态,并且每次生成新的随机数时,该状态都会更新。因此有一个副作用-RNG状态发生变化。

  2. 一个真正的随机生成器,它从熵源中提取随机位。再次,该池将被使用并且可能已耗尽-这是一个非纯函数的征兆。

答案 1 :(得分:1)

“随机数生成器”不能是纯函数,除非它需要生成一个看起来随机数的所有信息预先传递给它。如果生成器使用其他任何东西(例如系统时钟或文件系统),则生成器将不是纯粹的。例如,纯函数包括:

  • 哈希函数。
  • 获取种子并输出随机数和新种子的函数。
  • 具有内部状态并输出随机数和新内部状态的函数。

请参阅我的“ Designs for PRNGs”部分。