为什么RAND()不生成随机数?

Ste*_*ner 9 sql t-sql sql-server

我回答一个问题,并发射了我的SSMS发布前测试一点查询,但得到了一些奇怪的结果.这是查询:

UPDATE Person
SET   Pos_X = Rand()
    , Pos_Y = Rand(id)

SELECT ID, Surname, Forename, Pos_X, Pos_Y FROM Person
Run Code Online (Sandbox Code Playgroud)

以下是结果集:

1   Bloggs  Fred    0.332720913214171   0.713591993212924
2   Doe     Jane    0.332720913214171   0.713610626184182
3   Smith   Mary    0.332720913214171   0.71362925915544
4   Jones   Martha  0.332720913214171   0.713647892126698
5   Jones   Martha  0.332720913214171   0.713666525097956
6   Jones   Martha  0.332720913214171   0.713685158069215
7   Jones   Martha  0.332720913214171   0.713703791040473
8   Jones   Martha  0.332720913214171   0.713722424011731
9   Jones   Martha  0.332720913214171   0.713741056982989
Run Code Online (Sandbox Code Playgroud)

正如我所预期的那样没有种子的兰德在每一行都会得到相同的结果,但是我希望rand与种子(albiet只是数字1到9)会比0.0002之内的有序列表好一点!

你也一样吗?这听起来像是可以发现粗心大意的东西.

我相信这是相关的:

@@Version = 'Microsoft SQL Server 2005 - 9.00.5000.00 (Intel X86)   Dec 10 2010 10:56:29   Copyright (c) 1988-2005 Microsoft Corporation  Express Edition on Windows NT 6.1 (Build 7601: Service Pack 1)  '
Run Code Online (Sandbox Code Playgroud)

Ode*_*ded 15

RAND(Transact SQL):

返回从0到1 的伪随机浮点值,不包括.

和:

具有相同种子值的RAND()的重复调用返回相同的结果.

(强调我的)

  • 也许文档还应该说“使用相似的种子值重复调用 RAND() 会返回相似的结果。” (2认同)

Eli*_*ain 6

请您尝试使用以下查询,它始终提供所需的随机数。

SELECT RAND(CAST(RIGHT(CAST(CAST(CRYPT_GEN_RANDOM(4) 
                         AS INT) AS VARCHAR(100)), 1) AS INT))
Run Code Online (Sandbox Code Playgroud)

更新:根据对话,我已将答案更改如下:

SELECT CAST(CRYPT_GEN_RANDOM(4) AS INT)
Run Code Online (Sandbox Code Playgroud)

  • @webturner - 如果您使用的是 SS2008,您可以使用 `select CAST(CRYPT_GEN_RANDOM(4) AS int)` 来获取随机整数。根本不需要涉及`rand`。 (2认同)