【问题标题】:Is this function pure? (Random computation, deterministic result)这个函数是纯的吗? (随机计算,确定性结果)
【发布时间】:2019-07-04 23:52:23
【问题描述】:

纯函数定义为:

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

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

直观地说,在我看来,这个函数是的,尽管它的计算是不确定的。它为相同的参数产生相同的值,并且不会产生任何副作用。我能想到的唯一可能的“副作用”是,如果输入足够大,计算有可能永远持续下去。我对这个函数的标记是否正确 pure

【问题讨论】:

  • 只有为函数创建一个新的随机生成器,由非随机种子播种,然后丢弃它,这使得它实际上是非随机的,它才是纯粹的。 (如果您使用随机种子,则会影响外部随机源)。
  • 确实满足1,但如果使用外部RNG则不满足2。
  • 函数如何知道“何时所有整数都已被访问”?还是只是未指明?

标签: random functional-programming deterministic purely-functional


【解决方案1】:

不,我不这么认为。

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-07
      • 1970-01-01
      • 2019-10-05
      • 1970-01-01
      • 1970-01-01
      • 2016-02-09
      • 2021-08-05
      • 2017-01-13
      相关资源
      最近更新 更多