【发布时间】: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 告诉我我不理解这个问题并不能帮助我理解如何找到解决方案。它只会强化我实际上不明白如何解决我的问题。也许你可以回答,感觉你似乎比我更了解它,纠正我对随机化的无知?