【问题标题】:How to get the number e (2.718) using a random number sensor?如何使用随机数传感器获取数字 e (2.718)?
【发布时间】:2021-10-26 00:41:37
【问题描述】:

是否可以使用随机数计算数字 e (2.718)?

【问题讨论】:

标签: random numbers discrete-mathematics


【解决方案1】:

这是另一种选择。考虑下面的概率问题:你有一个偏向硬币,正面朝上的概率为 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,

这还不错。

【讨论】:

    【解决方案2】:

    我假设当您说“使用随机数”时,您的意思是“使用某种随机抽样方案”。如果你想得到无限小数的确切答案,答案是“不,除非你有无限的时间”。但是,我们可以生成期望值为 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)
    

    【讨论】:

    • 不,我的意思是随机数。我可以解释一下“你如何通过抛硬币得到数字 e?”
    • 顺便说一句,如果需要更多详细信息来回答您想要的问题,那么您需要编辑问题本身,而不是在 cmets 中添加额外的约束。
    • 抛硬币的结果可以被视为比特,将正面/反面转换为 0/1(或相反)。所有的计算机都是基于二进制的,所以如果你的位是独立的并且具有相同的 0 或 1 概率,那么你实际上是无家可归的。使用各种已知技术中的任何一种将它们转换为 U(0,1),例如将它们分组为字大小的簇,然后除以 max-int,或者将它们分组为 53 位簇并将它们填充到IEEE double 的尾数。如果它们不是 50/50 或不是连续独立的,则有一些技巧可以调整,但这离找到 e 还很遥远。
    • 我不对 cme​​ts 施加限制。您在掷硬币的示例中误解了“使用随机数”,我解释说我的意思是随机数。借助硬币可以生成随机数的事实太简单了,我们不应该关注这一点。
    • 你知道生成 Uniform(0,1)使用随机数吗?如果你的陈述不是这个意思,那么你有责任澄清你的意图,这样做的地方是问题本身,而不是 cmets。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-01
    • 2019-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多