【问题标题】:Random numbers with orders less than E-1订单数小于 E-1 的随机数
【发布时间】:2021-04-23 14:13:23
【问题描述】:

我目前正在 Python 中进行动力学蒙特卡罗模拟,因此我需要生成 0 到 1 之间的伪随机数,它们遵循均匀分布,但我正在寻找获得在某些点上的数字小于 E-1,例如 0.001。我知道这不会很常见,因为它们毕竟是随机数,但我的问题始于蒙特卡洛的实现。

我的蒙特卡罗模拟中的问题,简而言之,我有一个 constraint_probability=c 和一个 pseudo-random number=r,但是由于我的动态问题,我的条件是我的代码仅在 r 时运行。例如,如果我制作 c=0.001,我的代码永远不会运行。

我的第一个想法是使用random.uniform,但我发现得到的数字至少是E-2的顺序。

后来我想我的问题可以通过做如下函数来解决:

from scipy.stats import uniform


def numrand():
        vec=np.linspace(uniform.ppf(0),uniform.ppf(1), 10000) 
        return random.choice(vec)

我不知道是否有可能获得小于 E-1 的随机数,或者是否是另一种让我的代码运行的方法。

【问题讨论】:

  • 这里根本不清楚你在问什么。一旦您声明随机数在 0 和 1 之间是均匀的,那么均匀性意味着它们同样可能是 0 和 1 之间的任何结果,并且平均只有十分之一的随机数会低于 E-1。如果您想在蒙特卡洛模拟中描述您想要完成的任务,它可能会帮助我们其他人更好地理解您的问题。顺便说一句,一句老程序员的格言是,正确性是第一位的,然后你可以担心优化。
  • 感谢您的建议,我编辑了我的帖子

标签: python random montecarlo uniform-distribution


【解决方案1】:

numpy.random 可能会在这里为您提供帮助,创建 0 到 1 之间的 10000 个随机数,您可以使用均匀分布

np.random.default_rng().uniform(0, 1, 10000)

或者对于旧的 numpy 版本:

np.random.uniform(0, 1, 10000)

【讨论】:

    【解决方案2】:

    你可以告诉np.random.uniformmax and min value that you want。由于您似乎想要〜10-5的数字,请询问min=1e-5max=1e-4

    vec = np.random.uniform(1e-5, 1e-4, 10000)
    assert (vec >= 1e-5).all() and (vec < 1e-4).all()
    

    由于样本在半开区间[min, max) 上是均匀分布的,因此您可以放心,您从分布中得到的任何数字都将是 10-5

    这也应该适用于其他发行版。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-27
      • 2020-08-08
      • 1970-01-01
      • 2014-06-23
      • 2011-07-26
      • 2018-09-21
      • 2013-07-22
      • 2014-03-02
      相关资源
      最近更新 更多