如何用Python的numpy生成[0,x]闭区间内均匀分布的随机浮点数组
生成[0,x]闭区间均匀分布浮点数组的可行方案
方案一:用numpy新版随机数生成器(推荐)
numpy从1.17版本开始提供了全新的随机数生成API(np.random.default_rng()),底层采用PCG64算法,均匀性有可靠保障,同时避免了简单[0,1]浮点数乘x的缺陷。
默认的uniform方法生成左闭右开区间[low, high),要覆盖到x的话,利用小自然数x的浮点表示精确的特性,给high参数加一个极小的浮点数精度值即可:
import numpy as np # 初始化高质量随机数生成器 rng = np.random.default_rng() x = 100 # 示例小自然数(<2^8) target_shape = (20, 2) # 生成[0, x]闭区间的均匀分布数组 # 加eps确保随机数能取到x的精确值 arr = rng.uniform(low=0.0, high=x + np.finfo(np.float64).eps, size=target_shape) # 验证是否包含x(样本量足够时大概率为True) print(np.any(np.isclose(arr, x)))
方案二:整数映射法(严格确保包含x)
如果需要绝对保证数组中能出现x,可以先生成大范围的整数随机数,再线性映射到[0,x]区间。这种方法的均匀性依赖于整数随机数的均匀性,对小x来说精度完全足够:
import numpy as np x = 100 target_shape = (20, 2) # 取足够大的整数基数,保证映射后的浮点值足够密集 base = 2**20 rng = np.random.default_rng() # 生成[0, base]的整数,再归一化到[0, x] arr = rng.integers(low=0, high=base + 1, size=target_shape, dtype=np.int64) * (x / base) # 此时arr中必然存在等于x的元素(当整数取到base时) print(np.any(arr == x))
为什么原方法有缺陷?
你提到的[0,1]浮点数乘x的简易方法,本质是把双精度浮点数的离散步长(1/2^53)直接放大x倍。当x不是2的幂时,这些步长会变成非均匀的二进制分数,导致某些区间的数值无法被生成,破坏了均匀性。而numpy内置的随机数生成器会通过更合理的映射方式,避免这种步长不均的问题。
内容的提问来源于stack exchange,提问作者AlMa1r
相关产品推荐
相关产品推荐

