【发布时间】:2021-10-26 00:41:37
【问题描述】:
是否可以使用随机数计算数字 e (2.718)?
【问题讨论】:
-
“随机数”是什么意思?对这些数字有什么了解?
标签: random numbers discrete-mathematics
是否可以使用随机数计算数字 e (2.718)?
【问题讨论】:
标签: random numbers discrete-mathematics
这是另一种选择。考虑下面的概率问题:你有一个偏向硬币,正面朝上的概率为 1/n。然后你将硬币翻转 n 次。你从不摇头的概率是多少?嗯,这就是你翻转 n 次的概率,即 (1 - 1/n)n,随着 n 趋于无穷大,它开始迅速接近 1/e。因此,您可以通过选取一些适中的 n 值来估计 e,模拟以 1/n 的概率出现正面的硬币的 n 次投掷,并查看您是否从不正面朝上。不产生正面的试验比例将接近 1/e,您可以从那里估算 e。
例如,下面的 Python 代码以 1/n 的正面概率翻转硬币总共 n 次(通过对 0 和 1 之间的均匀随机数进行采样来完成)并查看它们是否都是反面:
from random import random
def one_trial(n):
for i in range(n):
if random() < 1 / n:
return False
return True
然后我们可以运行大量的试验,看看它们中的哪一部分都是尾巴。这个分数大约是 1/e,所以我们只取倒数:
def estimate_e(n, num_trials):
successes = 0
for i in range(num_trials):
if one_trial(n):
successes += 1
return num_trials / successes
在 n = 210 和 num_trials = 220 的情况下,我得到了估算值
e ≈ 2.7198016257969466,
这还不错。
【讨论】:
我假设当您说“使用随机数”时,您的意思是“使用某种随机抽样方案”。如果你想得到无限小数的确切答案,答案是“不,除非你有无限的时间”。但是,我们可以生成期望值为 e 的随机序列,并且可以使用基本统计量来评估采样误差。通过增加样本量,只要您指定所需的置信水平,我们就可以将抽样误差降低到您想要的任何精度。
It turns out that if you sum a bunch of random uniform(0,1)'s until the sum exceeds 1, the quantity of uniforms required has an expected value of e.我们可以通过编写一个方法/函数来返回计数,并取多次调用该方法获得的值的平均值,从而将其转化为采样问题。
您没有指定任何特定的语言,所以这里是 Ruby(实际上类似于伪代码):
require 'quickstats' # install from rubygems w/ 'gem install quickstats'
def trial # generate results of one trial
count = 0
sum = 0.0
while sum < 1.0
count += 1
sum += rand # Ruby's rand produces U(0,1) values by default
end
return count # added "return" keyword for non-rubyists' readability
end
stats = QuickStats.new
10_000_000.times { stats.new_obs trial } # more precision? bump up sample size
puts "Average = #{stats.avg}"
half_width = 1.96 * stats.std_err
puts "CI half-width = #{half_width}"
deviation = (stats.avg - Math::E).abs
puts " |E - avg| = #{deviation} (should be ≤ half-width 95% of the time)"
这在我的笔记本电脑上运行不到 4 秒,并产生如下输出:
Average = 2.7179918000002234
CI half-width = 0.0005421324752620413
|E - avg| = 0.0002900284588216451 (should be ≤ half-width 95% of the time)
【讨论】: