我知道这个问题有很多重复,但我的问题有所不同。我想要做的是在[-0.5,0.5]范围内生成一个简单的随机浮点数。我一直在使用的是这个链接中表达的公式:
C++ random float number generation
我需要两个不同的随机浮点数jitter_dx
和jitter_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_dx
和jitter_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
总是(几乎)相同。两个值都是在另一个值之后计算的,中间没有任何代码。你可以帮我找到问题吗?提前谢谢。
答案 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是一个有趣的手表。