使用SQL Server,我需要获取随机数,但每次运行代码时都需要相同的结果。通常,这意味着使用种子,但据我所知,SQL的RAND函数使用公式:
RAND(@Seed) = 0.00001863297* @Seed + 0.71357336
截断的整数,你知道,不是特别随机。 Here's a chart I made of it because I couldn't quite believe it myself。
这是用代码制作的:
DECLARE @i int = 1;
CREATE TABLE #Test (
seed int
, ran float);
WHILE @i < 10000
BEGIN
INSERT INTO #Test
( seed
, ran)
SELECT @i*23
, Rand(@i*23)
SET @i = @i + 1;
END;
无论如何,有没有办法从SQL中的种子生成真正的随机数?
答案 0 :(得分:0)
你可以使用newid()和rand,如下所示
select convert(int,rand(convert(varbinary,newid()))*@seed)
随机数插入10000个数字而不是while循环
insert into #test
select top (10000) seed = row_number() over (order by (select null))
,ran = convert(int,rand(convert(varbinary,newid()))*10000)
from master..spt_values n1, master..spt_values n2
答案 1 :(得分:0)
你错过了种子的意义。
您只能将{em>第一次调用的种子参数用于RAND()
。后续调用不应使用该参数。
阅读docs。
具有相同种子值的RAND()的重复调用返回相同的结果。 对于一个连接,如果使用指定的种子值调用RAND(),则所有后续的RAND()调用都会根据种子RAND()调用生成结果。
显示的示例SELECT RAND(100), RAND(), RAND()
将始终返回相同的结果。