Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql CRYPT_GEN_随机奇异效应_Sql_Sql Server_Tsql_Sql Server 2008_Random - Fatal编程技术网

Sql CRYPT_GEN_随机奇异效应

Sql CRYPT_GEN_随机奇异效应,sql,sql-server,tsql,sql-server-2008,random,Sql,Sql Server,Tsql,Sql Server 2008,Random,我想从小范围的整数(小于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),

我想从小范围的整数(小于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


它位于Microsoft Connect。下面是正在发生的事情

谢谢你的选择,我相信还有更多。但是你能解释一下我的代码的奇怪效果吗?也许OP有一个很好的理由需要一个加密质量的随机数。MS说:“以‘无法修复’的方式关闭这个bug。”令人失望,但我理解他们的推理,尽管“允许优化改变程序的语义”听起来确实很令人担忧!在Sql Server中将其重命名为薛定谔的cat或不确定性原则!哈哈。