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

标签 mysql sql random

我正在尝试获取从 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/

相关文章:

mysql - 在多个表中更新,设置多个值

php - 代码点火器。如何在表 int() 列中插入时间戳格式的字符串值

php - Jquery 验证检查数据库中是否存在值

mysql - 如何验证两个表是否有完全相同的数据?

c - 减去或添加到随机数生成器

javascript - 如何随机打乱包含名称字符串的数组?

mysql - 使用条件将 mysql 表连接到自身

php - 在搜索模型 Yii2 中加入关系后获取未知的空属性

mysql - 这个存储过程(嵌套 SELECT)有什么问题?

python - 如何从文本文件中选择随机行