我们都知道并喜欢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
。
答案 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
但同样,这更像是一个概念证明,而不是其他任何东西。