gpt4 book ai didi

sql - CRYPT_GEN_RANDOM 奇怪的效果

转载 作者:行者123 更新时间:2023-12-02 23:11:13 24 4
gpt4 key购买 nike

我想从一个小范围的整数(小于 200)中随机选择一个值。作为

的替代方案
SELECT RAND()

我正在尝试使用

CAST(CAST(CRYPT_GEN_RANDOM(2) AS INTEGER) AS FLOAT) / 65535

但我得到了一些奇怪的效果。

例如:

WITH Numbers (num)
AS
(
SELECT num
FROM (
VALUES (1), (2), (3), (4),
(5), (6), (7), (8),
(9), (10)
) AS Numbers (num)
),
RandomNumber (num)
AS
(
SELECT CAST(
(CAST(CAST(CRYPT_GEN_RANDOM(2) AS INTEGER) AS FLOAT) / 65535)
* (SELECT COUNT(*) FROM Numbers) + 1
AS INTEGER
)
)
SELECT T1.num, R1.num
FROM Numbers AS T1
INNER JOIN RandomNumber AS R1
ON T1.num = R1.num;

我希望这会返回一行且两列值相等。

但是,它会返回零行、一行或多行,并且列值只是偶尔相等。

知道这里发生了什么吗?

最佳答案

试试这个:

select abs(checksum(newid()))%200

更新

这里发生了一些可疑的事情:

select 'Not in the range! This is impossible!' [Message]
where cast(CAST(CAST(CRYPT_GEN_RANDOM(2) AS int) AS float) / 65535 * 10 as int)
not in (0,1,2,3,4,5,6,7,8,9)

F5 直到收到消息。

更新2

此查询具有相同的效果:

select 'Not in the range! This is impossible!' [Message]
where abs(checksum(newid()))%10
not in (0,1,2,3,4,5,6,7,8,9)

更新3

select N'WTF? Schrödinger''s cat!' [Message], *
from (select 0 union select 1) t(n)
join (select abs(checksum(newid()))%2 rnd) r(n) on t.n = r.n

最后一个查询有时可能会返回 2 行,这本质上意味着 abs(checksum(newid()))%2 同时返回 0 和 1,这是不可能的,因为它包含在“仅选择一行”语句,因此该值会在连接完成后更新。 :|然后连接再次发生,这令人震惊。

更新4

a known bug在微软连接。这是 an insightful article关于正在发生的事情。

关于sql - CRYPT_GEN_RANDOM 奇怪的效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3767486/

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