生成截断到2位小数的随机数

时间:2013-05-10 21:11:38

标签: python random numpy

我想生成介于0和0.5之间的均匀分布的随机数,但截断到2位小数。

没有截断,我知道这是由

完成的
import numpy as np
rs = np.random.RandomState(123456)
set = rs.uniform(size=(50,1))*0.5

任何人都可以帮我提供有关如何生成最多2 d.p.的随机数的建议。只要?谢谢!

4 个答案:

答案 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)