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

时间:2015-07-22 10:19:14

标签: c++ random visual-studio-2013 floating-point

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

C++ random float number generation

我需要两个不同的随机浮点数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))));

现在,我的问题很奇怪,因为当我尝试调试代码时,jitter_dx似乎总是相同(或略有不同),而jitter_dy是随机生成的。我特此在10个不同的调试会话中为您提供jitter_dxjitter_dy的值:

0.213156521, 0.123004854

0.215659022, 0.323389411

0.216849267, 0.259575188

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总是(几乎)相同。两个值都是在另一个值之后计算的,中间没有任何代码。你可以帮我找到问题吗?提前谢谢。

1 个答案:

答案 0 :(得分:6)

如果我没记错的话,MSVC在公共rand之后实现srand(time(NULL))所产生的序列在时间上有一种非常可预测的方式,在某种意义上说,时间(与1970年1月1日00:00:00和2038年1月19日03:14:07 UTC之间的时间相比较小)将导致非常相似的结果序列。

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

您真正应该做的是使用现代<random>(或boost.random,如果您不能使用C ++ 11)设施,为您的应用std::uniform_real_distribution

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