上网查了下C++生成一定范围内随机数的方法,一般都是下面这种:
for (int t = 0; t < 100; ++t){
int target = rand() % (max-min+1) + min;
cout<<target<<endl;
}
然后发现输出为:

都是以163开头的。。。
再看下Python的效果。
代码:
for t in range(100):
target = numpy.random.randint(LIM_LOW, LIM_HIGH)
loss_limits = [target - LIM_LOW, LIM_HIGH - target]
print(target)
输出:

这个随机性就好很多。我想了一下上面C++代码在区间值下限比较小的时候效果会比较好,但是我这个问题的下限到了16300000+,离2147483647只差100倍了。
所以我决定先求个0-1的随机浮点数,然后映射到目标区间上,代码如下:
for (int t = 0; t < 100; ++t){
float num;
num = (rand() % 1000) * 0.001;
int target = num * (max-min+1) + min;
cout << target << endl;
}
结果:

可以看到随机效果已经和numpy.random.randint(low,high)类似了。
先这么替换着,以后可能发现更好的方法也说不定。。
本文探讨了C++和Python中随机数生成的差异,特别是在大数值范围内的表现。作者通过实验发现,C++直接使用rand()函数在大范围内生成随机数时存在偏斜,而通过生成0-1之间的浮点数再映射到目标区间的方法能显著改善随机性,效果接近Python的numpy.random.randint()。
907

被折叠的 条评论
为什么被折叠?



