gpt4 book ai didi

sql-server - 如何为 T-SQL 选择中的每一行生成随机数?

转载 作者:行者123 更新时间:2023-12-01 16:19:43 27 4
gpt4 key购买 nike

我的表中的每一行都需要一个不同的随机数。以下看似显而易见的代码对每一行使用相同的随机值。

SELECT table_name, RAND() magic_number 
FROM information_schema.tables

我想从中得到一个 INT 或一个 FLOAT。故事的其余部分是我将使用这个随机数来创建相对于已知日期的随机日期偏移量,例如距开始日期 1-14 天的偏移。

这适用于 Microsoft SQL Server 2000。

最佳答案

看看SQL Server - Set based random numbers其中有非常详细的解释。

总而言之,以下代码生成一个 0 到 13 之间(含 0 到 13)的均匀分布随机数:

ABS(CHECKSUM(NewId())) % 14

要更改范围,只需更改表达式末尾的数字即可。如果您需要一个包含正数和负数的范围,请格外小心。如果你做错了,可能会重复计算数字 0。

对房间里的数学迷的一个小警告:这段代码有一个非常轻微的偏差。 CHECKSUM() 产生的数字在 sql Int 数据类型的整个范围内是统一的,或者至少与我(编辑器)测试所显示的接近。但是,当 CHECKSUM() 生成位于该范围最顶端的数字时,会出现一些偏差。每当您获得最大可能整数和最大整数之前所需范围大小的最后一个精确倍数(在本例中为 14)之间的数字时,这些结果都会优先于无法生成的范围的剩余部分最后一个 14 的倍数。

举个例子,假设 Int 类型的整个范围只有 19。19 是您可以容纳的最大整数。当 CHECKSUM() 结果为 14-19 时,这些对应于结果 0-5。这些数字比 6-13 更受青睐,因为 CHECKSUM() 生成它们的可能性是 6-13 的两倍。从视觉上证明这一点更容易。以下是我们的假想整数范围的整个可能结果集:

Checksum Integer: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19Range Result:     0 1 2 3 4 5 6 7 8 9 10 11 12 13  0  1  2  3  4  5

您可以在这里看到,产生某些数字的机会比其他数字多:偏差。值得庆幸的是,Int 类型的实际范围要大得多……以至于在大多数情况下偏差几乎无法检测到。但是,如果您发现自己为严格的安全代码这样做,则需要注意这一点。

关于sql-server - 如何为 T-SQL 选择中的每一行生成随机数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1045138/

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