python生成和为1的随机数_生成0.1到1.0之间的随机数。Python

你可以这样做:>>> import numpy as np

>>> a=.1

>>> b=np.nextafter(1,2)

>>> print(b)

1.0000000000000002

>>> [a+(b-a)*random.random() for i in range(10)]np.random.uniform(low=0.1, high=np.nextafter(1,2), size=1)

nextafter将生成特定于平台的下一个可表示的朝某个方向的浮点数。使用numpy的random.uniform是有利的,因为它不包含上界是明确的。

编辑

马克·迪金森的评论似乎是正确的:Numpy's documentation关于random.uniform是否包含上界是不正确的。

Numpy文档声明All values generated will be less than high.

这很容易被反驳:>>> low=1.0

>>> high=1.0+2**-49

>>> a=np.random.uniform(low=low, high=high, size=10000)

>>> len(np.where(a==high)[0])

640

在这个有限的范围内,结果也不一致:>>> for e in sorted(set(a)):

... print('{:.16e}: {}'.format(e,len(np.where(a==e)[0])))

...

1.0000000000000000e+00: 652

1.0000000000000002e+00: 1215

1.0000000000000004e+00: 1249

1.0000000000000007e+00: 1288

1.0000000000000009e+00: 1245

1.0000000000000011e+00: 1241

1.0000000000000013e+00: 1228

1.0000000000000016e+00: 1242

1.0000000000000018e+00: 640

然而,结合J.F.塞巴斯蒂安和马克·狄金森的评论,我认为这是可行的:import numpy as np

import random

def rand_range(low=0,high=1,size=1):

a=np.nextafter(low,float('-inf'))

b=np.nextafter(high,float('inf'))

def r():

def rn():

return a+(b-a)*random.random()

_rtr=rn()

while _rtr > high:

_rtr=rn()

if _rtr

_rtr=low

return _rtr

return [r() for i in range(size)]

如果以马克注释中的最小值分布运行,则离散浮点值非常少:l,h=1,1+2**-48

s=10000

rands=rand_range(l,h,s)

se=sorted(set(rands))

if len(se)<25:

for i,e in enumerate(se,1):

c=rands.count(e)

note=''

if e==l: note='low value end point'

if e==h: note='high value end point'

print ('{:>2} {:.16e} {:,}, {:.4%} {}'.format(i, e, c, c/s,note))

它产生所需的均匀分布,包括端点:1 1.0000000000000000e+00 589, 5.8900% low value end point

2 1.0000000000000002e+00 544, 5.4400%

3 1.0000000000000004e+00 612, 6.1200%

4 1.0000000000000007e+00 569, 5.6900%

5 1.0000000000000009e+00 593, 5.9300%

6 1.0000000000000011e+00 580, 5.8000%

7 1.0000000000000013e+00 565, 5.6500%

8 1.0000000000000016e+00 584, 5.8400%

9 1.0000000000000018e+00 603, 6.0300%

10 1.0000000000000020e+00 589, 5.8900%

11 1.0000000000000022e+00 597, 5.9700%

12 1.0000000000000024e+00 591, 5.9100%

13 1.0000000000000027e+00 572, 5.7200%

14 1.0000000000000029e+00 619, 6.1900%

15 1.0000000000000031e+00 593, 5.9300%

16 1.0000000000000033e+00 592, 5.9200%

17 1.0000000000000036e+00 608, 6.0800% high value end point

在OP请求的值上,它还产生一个均匀分布:import matplotlib.pyplot as plt

l,h=.1,1

s=10000

bin_count=20

rands=rand_range(l,h,s)

count, bins, ignored = plt.hist(np.array(rands),bin_count)

plt.plot(bins, np.ones_like(bins)*s/bin_count, linewidth=2, color='r')

plt.show()

输出

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值