提问人:klm123 提问时间:9/23/2021 最后编辑:klm123 更新时间:9/24/2021 访问量:218
MYSQL RAND()函数的精度是多少?以及如何生成巨大的随机数?
What is precision of MYSQL RAND() function? and how to generate huge random numbers?
问:
MYSQL RAND()函数的精度是多少?
我在官方页面上找不到它:MYSQL RAND() 函数被告知返回浮点数,不幸的是它的精度没有明确说明。它可以是单精度浮点数据,也可以是双精度浮点数据,也可以是任何其他类型的数据。
我想知道的是 - 我可以生成随机整数的最大整数范围是多少,这样就不会有任何“跳过”并且可以生成任何来自 to 的数字?[0,N]
FLOOR(RAND()*N)
0
N
我想知道的另一件事:
如何生成比MySQL更大的数字?N
答:
1赞
Thallius
9/24/2021
#1
正如MySQL文档中所写的,精度取决于系统。所以你的问题没有一个答案。
https://dev.mysql.com/doc/internals/en/floating-point-types.html
由于MySQL使用float和double的机器依赖二进制表示来存储数据库中的值,因此我们必须关心这些值。如今,大多数系统都使用 IEEE 标准 754 进行二进制浮点运算。它将单精度数的表示形式描述为 1 位表示符号,8 位表示偏置指数,23 位表示分数,将双精度数表示为 1 位符号、11 位偏置指数和 52 位分数表示。但是,我们不能依赖每个系统都使用这种表示的事实。幸运的是,ISO C 标准要求标准 C 库有一个标头 float.h,用于描述机器上浮点表示的一些细节。上面的注释描述了值DBL_DIG。C 数据类型 float 有一个等效值FLT_DIG。
最后,我不知道为什么随机数的精度在任何情况下都很重要。我看不到任何用例
评论
0赞
klm123
9/24/2021
谢谢。这很有帮助。如果您使用 23 位作为分数,那么 Rand()*2^24 将只有 2^23 个左右的结果。也就是说,你不能用这个函数生成从 0 到 16777215 的所有数字,这个范围内的一些数字将永远不可能获得,更不用说均匀分布了,其中从 0 到 16777215 的每个结果都应该有 1/16777216 的概率。如果您想要 0 到 10^100 范围内的数字 - 这甚至更糟。这就是精度很重要的原因。
0赞
Thallius
9/24/2021
您可以通过调用 rand() 两次或更多次来创建随机数,并将它们相加或相乘。
评论