我正在尝试获取从 0 到 359.9 的随机方位。
SET bearing = FLOOR((RAND() * 359.9));
我可以在同一个 while 循环中调用运行此请求的过程,一个接一个。不幸的是,随机化似乎绝非独一无二。例如
结果
358.07
359.15
357.85
我了解随机化的工作原理,并且我知道由于我对同一函数的快速调用,用于生成随机数的报价非常接近。
在任何其他情况下,我会在调用之间等待几毫秒或重新初始化我的 Random 对象(例如在 C# 中),这将大大改变我的随机性。但是,我不想在这种情况下等待。
如何在不等待的情况下增加随机性?
最佳答案
I understand how randomization works, and I know because of my quick calls to the same function, the ticks used to generate the random number are very close to one another.
这不太对。人们遇到麻烦的地方是,当他们用当前时间重复重新播种随机数生成器时,因为他们这样做很快,时间是相同的,他们最终用相同的种子重新播种 RNG。这导致 RNG 每次重新播种时都吐出相同的数字序列。
重要的是,“相同”是指完全相同。 RNG 要么返回相同的序列,要么返回完全不同的序列。 “接近”的种子不会产生“相似”的序列。您将获得相同的序列或完全不同的序列。
对此的正确解决方案不是错开重新播种,而是实际上停止重新播种 RNG。您只需为 RNG 播种一次。
无论如何,那既不存在也不存在。 MySQL 的 RAND()
函数不需要显式播种。当您不带参数调用 RAND()
时,系统会为您处理播种,这意味着您可以毫无问题地重复调用它。您可以调用它的频率没有基于时间的限制。
实际上,您的 SQL 看起来没有问题。事实上,您的帖子中缺少某些内容。由于您正在调用 FLOOR()
,因此您得到的结果应该始终是一个整数。您不可能从该作业中获得分数结果。您应该会看到如下积分结果:
187
274
89
345
这就是我反复运行 SELECT FLOOR(RAND() * 359.9)
得到的结果。
另外,就其值(value)而言,RAND()
永远不会返回 1.0。它的范围是 0 ≤ RAND()
< 1.0。使用 360 与 359.9 是安全的:
SET bearing = FLOOR(RAND() * 360);
关于mysql - 如何在我的 sql 查询中获得更好的随机化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5993725/