均匀的int32分布

时间:2019-03-04 17:59:09

标签: c++ uniform-distribution

有没有办法在没有警告的情况下统一分发int32_t? 我在代码中使用了uniform_int_distribution<int32_t>,但收到警告:

54988961.cpp: In function ‘int main()’:
54988961.cpp:6:64: warning: overflow in conversion from ‘double’ to ‘int’ changes value from ‘1.0e+10’ to ‘2147483647’ [-Woverflow]
     std::uniform_int_distribution<std::int32_t> unif(1,std::pow(10,10));
                                                        ~~~~~~~~^~~~~~~

这正是我的代码:

#include <cmath>
#include <cstdint>
#include <random>

int main() {
    std::uniform_int_distribution<std::int32_t> unif(1,std::pow(10,10));
}

2 个答案:

答案 0 :(得分:3)

pow(10, 10)

这是10000000000,一个int32只能容纳21474836472^31 - 1)。如果要存储int64_t,则应使用pow(10, 10)

由于您的最小值是1,所以您也可以选择其未签名的副本。

答案 1 :(得分:1)

对整数参数使用较大的双精度值(pow())会在constructor of uniform_int_distribution中引起此警告。

使用int常量代替。如果您需要的范围不适合int32_t,请使用int64_t模板参数。