gpt4 book ai didi

mysql - 为什么与 MariaDB 10.2 RAND() 函数发生如此多的冲突?

转载 作者:行者123 更新时间:2023-11-29 06:27:56 24 4
gpt4 key购买 nike

注意:在 Windows Server 2012 R2 Standard 上运行 MariaDB 10.2.27。

我想生成在 MariaDB 中使用的随机整数,因此我一直在尝试使用 MariaDB RAND() 函数。要么是我的期望和理解偏离了基础(绝对有可能!),要么是 MariaDB RAND() 函数不是很随机。

使用 BIGINT(20) 列,我想生成长度最多为 16 位的随机整数,因此我使用了以下 SQL:FLOOR(RAND()*9999999999999999)+1)。我在循环中使用的确切 SQL 是:

插入 rnd_test 值 (FLOOR(RAND()*9999999999999999)+1);

表 rnd_test 有一个 BIGINT(20) 列,并且是主 ID。

对于 10^16 个数字的池,并考虑生日悖论,我预计在生成 10^8 个数字后发生碰撞的可能性约为 50%。显然,这存在一些差异,但每次运行插入循环时,我几乎立即开始看到冲突,然后每 2000 或 3000 个生成的数字重复一次,有时更频繁。生成约 50,000 个随机数后,每隔几百个数字就会发生一次冲突。

我认为我的理解可能完全不正确,因此我调整了循环 vb.net 代码以在本地生成随机数,然后将其插入到 MariaDB 表中。我在例程的顶部定义了一个新的 System.Random,然后使用它来生成随机数:

Dim r As Long = CLng(Math.Floor(rNum.NextDouble() * 9999999999999999)) + 1

一般来说,这效果要好得多,但仍然不如我预期的那么好。在发生碰撞之前,它通常会运行大约 100,000 次迭代,之后似乎每生成 10,000 个随机数就会发生一到两次碰撞。有时一批 10,000 个会完全没有发生任何碰撞。

那么,为什么 MariaDB RAND() 函数与 vb.net 函数相比性能如此差?

最佳答案

对 5.6 的 RAND 的进一步实验表明,仅 30 位就可以了。也就是说,它只有大约 10 亿个不同的值。

通过 bugs.mysql.com 和/或 MariaDB 提交错误。

30 位对于大多数应用程序来说已经足够了。在那些它不够好的应用程序中,大多数人不会注意到它的弱点。

FLOAT 具有 24 位精度; DOUBLE 有 53。因此 30 需要 DOUBLE,但无法填满。

关于mysql - 为什么与 MariaDB 10.2 RAND() 函数发生如此多的冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58420671/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com