如何在我的SQL查询中获得更好的随机化?

时间:2011-05-13 14:52:39

标签: mysql sql random

我试图获得一个随机的方位,从0到359.9。

SET bearing = FLOOR((RAND() * 359.9));

我可以在同一个while循环中调用运行此请求的过程,紧接着在下一个循环之后。不幸的是,随机化似乎不是唯一的。 e.g。

结果

  

358.07

     

359.15

     

357.85

我理解随机化是如何工作的,我知道因为我对同一个函数的快速调用,用于生成随机数的刻度非常接近。

在任何其他情况下,我会在两次调用之间等待几毫秒或重新启动我的Random对象(例如在C#中),这会大大改变我的随机性。但是,我不想在这种情况下等待。

如何在不等待的情况下增加随机性?

1 个答案:

答案 0 :(得分:6)

  

我理解随机化是如何工作的,我知道因为我对同一个函数的快速调用,用于生成随机数的刻度非常接近。

那不太对劲。人们遇到麻烦的地方是当他们用当前时间重复播种随机数发生器时,并且因为他们非常快地完成它的时间是相同的并且他们最终用相同的种子重新播种RNG。这导致RNG在每次重新播种时吐出相同的数字序列。

重要的是,“相同”我指的是完全相同。 RNG要么返回相同的序列,要么返回完全不同的序列。 “接近”的种子不会产生“相似”的序列。您将获得相同的序列或完全不同的序列。

对此的正确解决方案不是错开重新种子,而是实际上停止重新播种 RNG。您只需要为RNG播种一次。


无论如何,这既不是在这里也不是在那里。 MySQL的RAND()函数不需要显式播种。如果您在没有参数的情况下致电RAND(),则会为您进行播种,这意味着您可以反复调用它而不会出现问题。没有基于时间的限制,您可以多久调用它。

实际上你的SQL看起来很好。事实上,你的帖子中缺少一些东西。由于您正在调用FLOOR(),因此您获得的结果应始终为整数。你不可能从这个任务中得到一个小数结果。你应该看到这样的整体结果:

187
274
89
345

这就是我反复运行SELECT FLOOR(RAND() * 359.9)所得到的。


此外,它的价值RAND()永远不会返回1.0。其范围是0≤RAND()< 1.0。你可以安全地使用360 vs. 359.9:

SET bearing = FLOOR(RAND() * 360);