首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >调用Math.random()的函数是纯函数吗?

调用Math.random()的函数是纯函数吗?
EN

Stack Overflow用户
提问于 2017-10-31 20:14:43
回答 9查看 16.2K关注 0票数 115

下面的函数是纯函数吗?

代码语言:javascript
复制
function test(min,max) {
   return  Math.random() * (max - min) + min;
}

我的理解是,一个纯函数遵循以下条件:

  1. 它返回一个从参数计算得到的值,
  2. 除了计算返回值

之外,它不做任何工作

如果这个定义是正确的,那么我的函数是纯函数吗?或者我对定义纯函数的理解是不正确的?

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2017-10-31 20:16:40

不,不是的。给定相同的输入,此函数将返回不同的值。然后你就不能建立一个映射输入和输出的‘表’。

来自Pure function的维基百科文章:

在给定相同的参数值的情况下,函数总是计算相同的结果值。函数结果值不能依赖于在程序执行过程中或在程序的不同执行之间可能改变的任何隐藏信息或状态,也不能依赖于来自I/O设备的任何外部输入

此外,另一件事是纯函数可以替换为表示来自输入和输出的映射的表,如this thread中所述。

如果您想重写此函数并将其更改为纯函数,则还应将随机值作为参数进行传递

代码语言:javascript
复制
function test(random, min, max) {
   return random * (max - min) + min;
}

然后这样调用它(例如,使用2和5作为min和max):

代码语言:javascript
复制
test( Math.random(), 2, 5)
票数 192
EN

Stack Overflow用户

发布于 2017-10-31 22:02:41

对你的问题的简单回答是Math.random() 违反了规则2。

这里的许多其他答案都指出,Math.random()的存在意味着该函数不是纯函数。但我认为值得一提的是,为什么Math.random()会影响使用它的函数。

与所有伪随机数生成器一样,Math.random()从一个“种子”值开始。然后,它将该值用作一系列低级位操作或其他操作的起点,这些操作会导致不可预测(但不是真正随机)的输出。

在JavaScript中,涉及的过程依赖于实现,并且与许多其他语言不同,JavaScript提供了no way to select the seed

该实现选择随机数生成算法的初始种子;它不能由用户选择或重置。

这就是为什么这个函数不是纯函数的原因: JavaScript本质上使用了一个您无法控制的隐式函数参数。它从其他地方计算和存储的数据中读取参数,因此违反了您定义中的规则#2。

如果你想使它成为一个纯函数,你可以使用here描述的替代随机数生成器之一。将该生成器称为seedable_random。它接受一个参数(种子)并返回一个“随机”数。当然,这个数字根本不是随机的;它是由种子唯一确定的。这就是为什么这是一个纯函数。seedable_random的输出只是“随机”的,因为根据输入预测输出是困难的。

这个函数的纯版本需要接受三个参数:

代码语言:javascript
复制
function test(min, max, seed) {
   return  seedable_random(seed) * (max - min) + min;
}

对于任何给定的(min, max, seed)参数三元组,这将始终返回相同的结果。

注意,如果您希望seedable_random的输出是真正随机的,则需要找到一种将种子随机化的方法!无论您使用哪种策略,都将不可避免地是非纯的,因为它将要求您从函数之外的源收集信息。正如mtraceurjpmc26提醒我的那样,这包括所有物理方法:hardware random number generatorswebcams with lens capsatmospheric noise collectors --甚至lava lamps。所有这些都涉及到使用在函数外部计算和存储的数据。

票数 53
EN

Stack Overflow用户

发布于 2017-10-31 20:17:13

纯函数是指返回值仅由输入值决定的函数,没有明显的副作用

通过使用Math.random,您可以通过输入值以外的其他值来确定它的值。它不是一个纯函数。

source

票数 40
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47035166

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档