当前位置: 首页 > 面试题库 >

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

鲁熙云
2023-03-14
问题内容

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

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

使用BIGINT(20)专栏中,我想生成随机整数最大长度为16位,所以我用这个SQL:
FLOOR(RAND()*9999999999999999)+1)。我在循环中使用的确切SQL是:

INSERT INTO rnd_test VALUES (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个批次完全没有碰撞。

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


问题答案:

5.6的RAND的进一步实验表明,只有30位是好的。也就是说,它只有大约十亿个不同的值。

使用bugs.mysql.com和/或MariaDB提交错误。

30位足以满足大多数应用的需求。在那些它还不够好的应用程序中,大多数人不会注意到它的缺点。

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



 类似资料:
  • 问题内容: 我有两个几乎相同的简单JS小提琴,它们在选择更改时调用一个函数。在这两种情况下,函数名称都与select ID相同,但是由于某种原因,第一个小提琴可以正常工作,而第二个小提琴却因JavaScript错误而失败 :在FF9(Linux),Chromium16(Linux),IE8(Windows)中正常运行: 和 在FF9(Linux),Chromium16(Linux),IE8(Win

  • 问题内容: 有一件我不理解的事情。 为什么这样 产生此错误: 问题答案: 发生这种情况是因为该模块没有名为的任何属性。该属性仅在您定义时定义。 子模块不会在您刚导入时自动导入;您需要显式导入它们。对于大多数软件包来说,情况相同,尽管软件包可以根据需要选择导入自己的子模块。(例如,如果包括一份声明, 然后 将子模块会随时导入进口。)

  • 问题内容: 为什么投给打破,当是? 问题答案: 不幸的是,没有办法对中的数组进行这样的转换。您将必须迭代数组并分别转换每个对象。 原因是安全类型,根本无法确保无需迭代遍历数组的内容就可以将其转换为Uri,这就是为什么必须对其进行迭代并分别进行转换的原因。 基本上因为可以被其他对象继承,所以不能保证数组仅包含对象。但是强制转换为超类型将是可行的,因为那样的话,类型安全就可以了。

  • 问题内容: 该功能运行什么?它只会运行吗? 问题答案: setState()将按以下顺序运行函数: 如果您的组件正在接收道具,它将使用上述功能运行该功能。

  • 我正在将一个rust应用程序打包到docker映像以部署到我的服务器。我发现rust docker的图像大小超过1GB(比使用java和python的任何其他应用程序都大)。为什么rust docker的形象如此巨大?我检查了该层,发现cargo build命令需要400MB以上的内存。 是否可以缩小rust docker的图像?

  • 问题内容: 我有一个配置单元表,该配置表按年,月,日和小时划分。我需要对其执行查询以获取最近7天的数据。这是在。我的查询当前看起来像这样: 这需要很长时间。当我用上面的实际数字代替时,请说: 它会在几分钟内完成。有什么办法可以更改上面的脚本,以便实际上只包含查询中的数字而不是函数? 我尝试使用像: 但这不能解决问题。 问题答案: 解决方案 原始查询出了什么问题? unix_timestamp()