【问题标题】:How can I get better randomization in my sql query?如何在我的 sql 查询中获得更好的随机化?
【发布时间】:2011-08-25 00:33:25
【问题描述】:

我正在尝试获取一个随机方位,从 0 到 359.9。

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

我可以在同一个 while 循环中调用运行此请求的过程,紧接着下一个循环。不幸的是,随机化似乎不是独一无二的。例如

结果

358.07

359.15

357.85

我了解随机化的工作原理,并且我知道由于我对同一函数的快速调用,用于生成随机数的刻度彼此非常接近。

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

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

【问题讨论】:

  • 来自 MySQL 文档:“RAND() 并不是一个完美的随机生成器。它是一种按需生成随机数的快速方法,可以在同一 MySQL 版本的平台之间移植。”
  • 你会重新初始化你的随机对象来解决滴答声靠得很近的问题吗?我认为您根本不了解 PRNG 的工作原理......
  • @Marc B 没错——这就是为什么我要问如何做得更好! :)
  • 鉴于 MySQL 的 RNG 不好,我建议使用从真实 PRNG 读取的数字预先填充一个表,例如 /dev/urandom 或系统上可用的任何内容。然后只需遍历每个查询的表。如果您定期刷新此随机表,它应该是 RAND() 的可接受替代
  • @Blindy 告诉我我不理解这个问题并不能帮助我理解如何找到解决方案。它只会强化我实际上不明白如何解决我的问题。也许你可以回答,感觉你似乎比我更了解它,纠正我对随机化的无知?

标签: mysql sql random


【解决方案1】:

我了解随机化的工作原理,并且我知道由于我对同一函数的快速调用,用于生成随机数的刻度彼此非常接近。

这不太对。人们遇到麻烦的地方是当他们用当前时间重复地重新播种随机数生成器时,因为他们做得很快,所以时间是相同的,他们最终会用相同的种子重新播种 RNG。这导致 RNG 每次重新播种时都会吐出相同的数字序列。

重要的是,我所说的“相同”是指完全相同。 RNG 要么返回相同的序列,要么返回完全不同的序列。 “关闭”种子不会导致“相似”序列。你要么得到一个相同的序列,要么得到一个完全不同的序列。

解决这个问题的正确方法不是错开重新播种,而是停止重新播种 RNG。您只需播种一次 RNG。


无论如何,这既不在这里也不在那里。 MySQL 的 RAND() 函数不需要显式播种。当您在没有参数的情况下调用RAND() 时,会为您处理播种,这意味着您可以重复调用它而不会出现问题。调用频率没有时间限制。

实际上,您的 SQL 看起来还不错。实际上,您的帖子中缺少某些内容。由于您正在调用FLOOR(),因此您得到的结果应该始终是一个整数。您无法从该作业中获得分数结果。你应该看到这样的积分结果:

187
274
89
345

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


另外,对于它的价值RAND() 将永远不会返回 1.0。它的范围是 0 RAND()

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

【讨论】:

  • 谢谢,这消除了 RAND 函数作为我的问题。您是对的,此问题中还有其他变量未列出。我会调查的。感谢您的提示!
猜你喜欢
  • 2015-01-08
  • 2021-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-16
  • 2018-09-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多