【问题标题】:Discretization size and Recurrence period of numpy uniformnumpy uniform的离散化大小和循环周期
【发布时间】:2018-06-22 07:59:25
【问题描述】:

我的问题是关于在[0,1) 上使用numpy.random.uniform 生成统一随机数生成器。

  1. 此实现是否涉及统一的step-size,即{0,a,2a,...,Na} 的可能性宇宙,其中(N+1)a = 1a 是恒定的?
  2. 如果上述情况属实,那么这个step-size 的值是多少?我注意到numpy.nextafter(x,y) 的值根据x 不断变化。因此我的问题是关于是否使用统一的step-size 来实现numpy.random.uniform
  3. 如果step-size 不统一,那么确定numpy.random.uniform(low=0, high=1) 可以采用的唯一值数量的最佳方法是什么?
  4. numpy.random.uniform 的重复周期是多少,即在多少个样本后我会再次看到我的原始编号?为了获得最大效率,这应该等于唯一值的数量。

我尝试在Github 查找源代码,但没有找到任何可直接解释的内容。

【问题讨论】:

  • 您在#4 中到底要问什么?单数重复?对于浮点数,这充其量是 2^32 - 2^25,或者对于双精度数是 2^64-2^52。序列重复?类似于 2^19337-1
  • 序列重复。对于 Mersenne Twister,它应该是 2^19337-1。

标签: python python-3.x numpy random precision


【解决方案1】:

相关函数是

double
rk_double(rk_state *state)
{
    /* shifts : 67108864 = 0x4000000, 9007199254740992 = 0x20000000000000 */
    long a = rk_random(state) >> 5, b = rk_random(state) >> 6;
    return (a * 67108864.0 + b) / 9007199254740992.0;
}

在 numpy 源代码树内的 randomkit.c 中找到。 如您所见,粒度为1 / 9007199254740992.0,恰好等于 2^-53,即(向下)float64 分辨率为 1。

>>> 1 / 9007199254740992.0
1.1102230246251565e-16
>>> 2**-53
1.1102230246251565e-16
>>> 1-np.nextafter(1.0, 0)
1.1102230246251565e-16

【讨论】:

  • 谢谢!关于复发期或如何找到它的任何线索?
  • @AmritPrasad 我认为这是mtrand.c 中定义的梅森捻线机。但我不知道它的周期。
猜你喜欢
  • 1970-01-01
  • 2021-06-18
  • 1970-01-01
  • 2012-04-30
  • 2020-12-08
  • 2018-11-25
  • 2022-01-24
  • 2018-04-29
相关资源
最近更新 更多