在C++中生成随机浮点数不起作用(Visual Studio 2013)

Tar*_*rta 1 c++ random floating-point visual-studio-2013

我知道这个问题有很多重复,但我的问题是不同的.我想要做的是在[-0.5,0.5]范围内生成一个简单的随机浮点数.我一直在使用的是这个链接中表达的公式:

C++随机浮点数生成

我需要两个不同的随机浮点数jitter_dxjitter_dy.根据上面链接的公式,我有:

float jitter_dx = -0.5f + static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / (0.5f - (-0.5f))));
float jitter_dy = -0.5f + static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / (0.5f - (-0.5f))));
Run Code Online (Sandbox Code Playgroud)

现在,我的问题很奇怪,因为当我尝试调试代码时,jitter_dx似乎总是相同(或略有不同),jitter_dy而是随机生成.在此,我给你带来的价值jitter_dx,并jitter_dy在10个不同的调试会话:

0.213156521,0.123004854

0.215659022,0.323389411

0.216849267,0259575188

0.217856407,-0.460295409

0.218955040,0.147907972

0.220358908,-0.259910882

0.221335471,0.0202490091

0.224143207,0.204702914

0.225333393,0.140888691

你可以看到jitter_dx总是(差不多)相同.两个值都是在另一个值之后计算的,中间没有任何代码.你可以帮我找到问题吗?提前致谢.

Bau*_*gen 6

如果我没记错的话,MSVC rand在共同之后执行的序列srand(time(NULL))依赖于一种非常可预测的时间方式,从某种意义上来说,时间的变化很小(与小时相比,时间在00:00:00之间) 1970年1月1日的UTC和2038年1月19日的UTC时间03:14:07将导致非常相似的结果序列.

如果你坚持使用rand,丢弃它产生的前几百或一千个值.然后结果将至少看起来更好(虽然仍然很糟糕).

你真正应该做的是为你的应用程序使用现代<random>(或者如果你不能使用C++ 11的boost.random)工具std::uniform_real_distribution.

有关详细信息,是一个有趣的手表.