表中的每一行都需要一个不同的随机数。下面的代码对每一行使用相同的随机值。

SELECT table_name, RAND() magic_number 
FROM information_schema.tables 

我想从中得到一个INT或FLOAT。接下来,我将使用这个随机数从已知日期创建一个随机日期偏移量,例如从开始日期的1-14天偏移量。

这是为Microsoft SQL Server 2000。


当前回答

回答老问题,但是这个答案之前没有提供,希望这对通过搜索引擎找到这个结果的人有用。

在SQL Server 2008中,引入了一个新函数CRYPT_GEN_RANDOM(8),它使用CryptoAPI生成一个加密强随机数,返回为VARBINARY(8000)。这里是文档页面:https://learn.microsoft.com/en-us/sql/t-sql/functions/crypt-gen-random-transact-sql

因此,为了获得一个随机数,你可以简单地调用函数并将其强制转换为必要的类型:

select CAST(CRYPT_GEN_RANDOM(8) AS bigint)

或者要获得一个介于-1和+1之间的浮点数,你可以这样做:

select CAST(CRYPT_GEN_RANDOM(8) AS bigint) % 1000000000 / 1000000000.0

其他回答

回答老问题,但是这个答案之前没有提供,希望这对通过搜索引擎找到这个结果的人有用。

在SQL Server 2008中,引入了一个新函数CRYPT_GEN_RANDOM(8),它使用CryptoAPI生成一个加密强随机数,返回为VARBINARY(8000)。这里是文档页面:https://learn.microsoft.com/en-us/sql/t-sql/functions/crypt-gen-random-transact-sql

因此,为了获得一个随机数,你可以简单地调用函数并将其强制转换为必要的类型:

select CAST(CRYPT_GEN_RANDOM(8) AS bigint)

或者要获得一个介于-1和+1之间的浮点数,你可以这样做:

select CAST(CRYPT_GEN_RANDOM(8) AS bigint) % 1000000000 / 1000000000.0

Rand()函数将生成相同的随机数,如果在表SELECT查询中使用。如果对Rand函数使用种子,同样适用。另一种方法是使用这个:

SELECT ABS(CAST(CAST(NEWID() AS VARBINARY) AS INT)) AS [RandomNumber]

从这里得到的信息,很好地解释了问题。

使用newid ()

select newid()

或者可能是这个

select binary_checksum(newid())

很简单:

DECLARE @rv FLOAT;
SELECT @rv = rand();

这将把一个0-99之间的随机数放入表中:

CREATE TABLE R
(
    Number int
)

DECLARE @rv FLOAT;
SELECT @rv = rand();

INSERT INTO dbo.R
(Number)
    values((@rv * 100));

SELECT * FROM R

当在单个批处理中多次调用rand()时,将返回相同的数字。

我建议使用convert(varbinary,newid())作为种子参数:

SELECT table_name, 1.0 + floor(14 * RAND(convert(varbinary, newid()))) magic_number 
FROM information_schema.tables

Newid()保证每次调用都会返回不同的值,即使是在同一个批处理中,因此将它作为种子将提示rand()每次给出不同的值。

编辑以获得从1到14的随机整数。