来自[0,1]的均匀分布的随机样本

时间:2015-10-22 04:40:13

标签: python numpy random probability

我们都知道并喜欢numpy函数random.rand,它“创建[s]给定形状的数组并使用来自均匀分布的随机样本传播它{{1} }}“:

[0, 1)

如果我希望>>> import numpy as np >>> np.random.rand(3,2) array([[ 0.14022471, 0.96360618], #random [ 0.37601032, 0.25528411], #random [ 0.49313049, 0.94909878]]) #random 上的均匀分布中的随机样本,我有哪些选择? 请注意细微差别: [0, 1]功能排除numpy;我想要的功能包括 1

2 个答案:

答案 0 :(得分:0)

如果我没有错,你可以建立一个小于1的最大数字:

import struct
m = struct.unpack("d",struct.pack("Q",eval("0b00" + "1"*9 + "0" + "1"*52)))[0]

似乎是:

m = struct.unpack("d",'\xff\xff\xff\xff\xff\xff\xef?')[0]

(根据IEEE 754标准)。看看:

from decimal import Decimal
Decimal(m)

打印:

Decimal('0.99999999999999988897769753748434595763683319091796875')

然后,只需将np.random.rand除以此值,就可以得到您想要的内容。

答案 1 :(得分:0)

我之前回答过你的问题(见我的另一个答案);我也发表了评论。正如我在评论中所说,我真的不相信你应该关心这个微小的差异;但也许你可以达到你想要的效果。

获取随机INTEGER,对应于[1,2] 中IEEE 754号码的位序列而不是[0,1],因为非规格化数字;将位转换为浮点IEEE 754数字;然后减去1.这将起作用,因为IEEE 754中[1,2]中的所有数字都是连续的。

# sequence of bit for 1.0
>>> eval("0b00" + "1"*10 + "0"*51 + "0")
4607182418800017408

# sequence of bit for first number after 2.0
>>> eval("0b01" + "0"*10 + "0"*51 + "1")
4611686018427387905

>>> struct.unpack("d",struct.pack("Q",np.random.randint(4607182418800017408,4611686018427387905)))[0]-1
0.9349236864324189

你应该能够得到0以及1.但是我不确定两个大整数值之间的整数是否完全一致......

清洁功能可以是:

from struct import pack, unpack
import numpy as np

def myrand():
  a = unpack("Q",pack("d",1.0))[0]               # 1.0
  b = unpack("Q",pack("d",np.nextafter(2,3)))[0] # 2.000000000000000444
  return unpack("d",pack("Q",np.random.randint(a,b)))[0]-1

但同样,这更像是一个概念证明,而不是其他任何东西。

相关问题