MYSQL RAND()函数的精度是多少?如何生成大数值随机数?
MySQL RAND()函数问题解答
RAND()的精度
MySQL内置的RAND()函数返回64位双精度IEEE 754浮点数,拥有53位二进制有效精度,对应十进制为15~17位有效数字。
FLOOR(RAND()*N)无跳数的最大N值
首先先明确范围规则:RAND()的返回值区间是左闭右开的[0, 1),所以FLOOR(RAND() * N)实际生成的是[0, N-1]区间的整数,如果你需要生成[0, N]区间的整数,应该使用FLOOR(RAND() * (N + 1))。
由于64位双精度浮点数可以精确表示所有不大于2^53(十进制值为9007199254740992)的整数,因此当生成的整数范围上限不超过这个值时,不会出现跳数,区间内的所有整数都有概率被命中。如果N超过2^53,则会因为浮点数精度不足,导致部分整数永远无法被生成。
大于2^53范围的随机数生成方案
你可以拼接多个RAND()的输出结果来得到更大范围的均匀随机数,示例代码如下:
-- 生成0到2^64-1范围内的随机整数 SELECT FLOOR(RAND() * 0x100000000) * 0x100000000 + FLOOR(RAND() * 0x100000000) AS large_random;
如果你需要指定大于2^53的上限M,可以将上述生成的大随机数对M取模。如果对随机数均匀性要求极高,可以采用拒绝采样优化:如果生成的随机数大于FLOOR(2^64 / M) * M,则丢弃该结果重新生成,即可完全避免不均匀问题。
内容的提问来源于stack exchange,提问作者klm123
相关产品推荐
相关产品推荐

