Xtensor random::randn生成随机数超出指定上下限范围问题
问题原因
你调用的xt::random::randn接口不符合你的使用预期:
- 该接口用于生成服从正态(高斯)分布的随机数,传入的后两个参数分别是正态分布的均值μ和标准差σ,并非你以为的取值下限、上限。
- 正态分布的理论取值范围为全体实数,按照你传入的均值-0.5、标准差0.5计算,生成值落在[-1, 0]区间的概率约68%,落在[-1.5, 0.5]区间的概率约95%,出现你运行结果里-0.57、-1.43这类超出[-0.5, 0.5]范围的数值是完全正常的。
解决方法
如果你需要生成形状为{10}、取值范围在[-0.5, 0.5]之间的均匀分布随机数,应该使用xt::random::rand接口:该接口默认生成[0, 1)区间的均匀分布随机值,做简单线性变换即可映射到目标区间。
修正后的代码如下:
#include <iostream> #include <xtensor/xio.hpp> #include <xtensor/xrandom.hpp> int main() { // [0,1)区间值减0.5,刚好映射为[-0.5, 0.5)区间的均匀分布随机数 xt::xarray<double> a = xt::random::rand<double>({10}) - 0.5; std::cout << a; return 0; }
如果你实际需要的是截断在[-0.5, 0.5]区间内的正态分布随机数,需要额外对
randn的生成结果做范围过滤/截断处理,无法直接通过传参限定取值上下限。
内容的提问来源于stack exchange,提问作者Jaisal Francis
相关产品推荐
相关产品推荐

