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

mti*_*ger 2 python random numpy

我想生成0到0.5之间均匀分布的随机数,但是截断到2个小数位.

没有截断,我知道这是通过

import numpy as np
rs = np.random.RandomState(123456)
set = rs.uniform(size=(50,1))*0.5
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮我提出如何生成高达2 dp的随机数的建议吗?谢谢!

aba*_*ert 5

A float不能被截断(或舍入)为2个十进制数字,因为有许多带有2个十进制数字的值,它们不能完全表示为IEEE双精度数.

如果你真的想要你想要的东西,你需要使用精确精确的类型,比如Decimal.

当然,这样做有一些缺点 - 对于numpy用户来说最明显的一个是你必须使用的dtype=object,具有所有的紧凑性和性能影响.

但这是实际做你要求的唯一方法.

最有可能的是,你真正想要做的就是Joran Beasley的答案(让它们不被截断,只是在打印输出时完成)或类似于Lauritz V. Thaulow的答案(得到最接近的近似值,然后使用显式epsilon检查到处).

或者,您可以进行隐式定点运算,正如David Heffernan在评论中建议的:生成0到50之间的随机整数,将它们保持为整数numpy,并将它们格式化为定点小数和/或Decimal在必要时转换为(例如,用于打印结果).这为您提供了Decimal无需成本的所有优势......虽然它确实打开了一个明显的窗口,通过忘记在某处移动2个位置来创建新的错误.

  • @mtigger:这是[每个计算机科学家应该知道的关于浮点运算的必要条件]的强制性链接(http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html). (2认同)