# 自然常数 e

# 简介

e,作为数学常数,是自然对数函数的底数。有时被称为欧拉数(Euler's number),以瑞士数学家欧拉命名;还有个较少见的名字纳皮尔常数,用来纪念苏格兰数学家约翰·纳皮尔引进对数。它是一个无限不循环小数,JavaScript 里,其近似值为 Math.E = 2.718281828459045

# 定义

# SymPy 实现

from sympy import *
n = symbols('n')
expr = (1 + 1/n) ** n
e = limit(expr, n, oo)
e.evalf()

# JS 实现

const max = 1e11
const e = (1 + 1 / max) ** max
console.log(e)

注意:由于理论上的定义,n 应当趋向于正无穷,但实际计算中,受 js 计算精度限制,max 取太大会有计算误差。自然底数 e 还有另一个无穷级数的定义:

根据这个,我们可以有限步地求前 N 项的和,我们需要用 js 实现一个阶乘

const factorial = (n) => {
  if (n < 2) return 1
  return n * factorial(n - 1)
}
function getE() {
  let ret = 0
  const max = 20
  for (let n = 0; n < max; n++) {
    ret += 1 / factorial(n)
  }
  return ret
}
console.log(getE())
2.7182818284590455

可以看到, 取前 20 位,工程上就足够可用了

# 应用

自然底数 e 有很多实际用处。

例:假设有 1000 个乒乓球,其中有一个是可以中奖的红球,那么抽 1000 次,中奖的概率是多少?

解:这是一个从数量为 N 的样本中“有放回地”随机抽取出1个"数量同样为N"的样本。其计算公式为 , 我们把 1000 - 10000 分别代进去,发现这个比值接近一个常数 0.36. 即你抽 1000 次,将有 360 次左右可以抽中红球。这个值与你直觉相符吗? 通过前面的定义,我们可以推导出,这个极限值为 1/e, 即

# 勘误

2020.11.16 更新

非常抱歉,上一个 case 说得不对,抽中的概率应该是 的概率,在此给大家造成的误导深表歉意。个人能力有限,欢迎一起共创。