MYSQL RAND()函数的精度是多少?以及如何生成巨大的随机数?

What is precision of MYSQL RAND() function? and how to generate huge random numbers?

提问人:klm123 提问时间:9/23/2021 最后编辑:klm123 更新时间:9/24/2021 访问量:218

问:

MYSQL RAND()函数的精度是多少?

我在官方页面上找不到它:MYSQL RAND() 函数被告知返回浮点数,不幸的是它的精度没有明确说明。它可以是单精度浮点数据,也可以是双精度浮点数据,也可以是任何其他类型的数据。

我想知道的是 - 我可以生成随机整数的最大整数范围是多少,这样就不会有任何“跳过”并且可以生成任何来自 to 的数字?[0,N]FLOOR(RAND()*N)0N

我想知道的另一件事: 如何生成比MySQL更大的数字?N

MySQL 随机 精度

评论

0赞 Thallius 9/23/2021
这会回答你的问题吗?en.wikipedia.org/wiki/IEEE_754
0赞 kmoser 9/24/2021
这回答了你的问题吗?如何获取mysql随机整数范围?
0赞 klm123 9/24/2021
@kmoser,不是吗?为什么你认为它可以回答我的问题?我关于 rand() 输出精度的问题,这个问题似乎是一个关于 rand 函数的一般使用的问题(我的问题实际上包括对该问题的答案 - FLOOR(RAND()*N))
0赞 klm123 9/24/2021
@ClausBönnhoff,这是对什么是浮点数的解释。在您告诉的同一个 wiki 页面上,它说它可以有不同的精度。我的问题是 RAND() 函数输出的精度是多少。
1赞 kmoser 9/24/2021
您始终可以编写一个存储过程,该存储过程在几乎任何范围内生成随机整数,保证没有任何“跳过”,只需重复连接随机数字,并将结果转换为整数即可。

答:

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() 两次或更多次来创建随机数,并将它们相加或相乘。