我想生成介于0和0.5之间的均匀分布的随机数,但截断到2位小数。
没有截断,我知道这是由
完成的import numpy as np
rs = np.random.RandomState(123456)
set = rs.uniform(size=(50,1))*0.5
任何人都可以帮我提供有关如何生成最多2 d.p.的随机数的建议。只要?谢谢!
答案 0 :(得分:5)
float
不能被截断(或舍入)为2个十进制数字,因为有许多带有2个十进制数字的值,不能完全表示为IEEE双精度数。
如果你真的想要你想说的话,你需要使用精确精确的类型,比如Decimal
。
当然,这样做有一些缺点 - numpy
用户最明显的一个原因是你将不得不使用dtype=object
,具有所有紧凑性和性能影响。
但这是实际做你要求的唯一方法。
最有可能的是,你实际上想要做的事情是Joran Beasley的回答(让他们不被截断,只是打印出来的时候)或类似于Lauritz V. Thaulow的回答(得到你可以使用最接近的近似值,然后在任何地方使用显式epsilon检查。)
或者,您可以进行隐式定点运算,正如David Heffernan在评论中建议的:生成0到50之间的随机整数,将它们保持为numpy
内的整数,并将它们格式化为定点小数和/或在必要时转换为Decimal
(例如,用于打印结果)。这为Decimal
提供了{{1}}的所有优点而没有成本......虽然它确实打开了一个明显的窗口,通过忘记在某处移动2个位置来创建新的错误。
答案 1 :(得分:3)
小数不会被截断为2位小数...但是它们的字符串表示可能是
import numpy as np
rs = np.random.RandomState(123456)
set = rs.uniform(size=(50,1))*0.5
print ["%0.2d"%val for val in set]
答案 2 :(得分:1)
这个怎么样?
np.random.randint(0, 50, size=(50,1)).astype("float") / 100
即,创建0到50之间的随机整数,并除以100.
修改强>
正如在评论中明确指出的那样,由于内存中浮动表示的性质,这不会给你精确的两位小数。看起来你的数组中确实有一个浮点0.1
,但它确实不是正是0.1
。但它 非常接近,你可以通过使用“双”数据类型来使它更接近。
您可以通过将数字保持为整数来推迟此问题,并记住在使用它们时它们将被除以100。
hundreds = random.randint(0, 50, size=(50, 1))
然后至少在最后一刻才会发生舍入(或者根本不会发生,如果等式的分子是分母的倍数)。
答案 3 :(得分:0)
我设法找到了另一种选择:
import numpy as np
rs = np.random.RandomState(123456)
set = rs.uniform(size=(50,2))
for i in range(50):
for j in range(2):
set[i,j] = round(set[i,j],2)