有没有办法从SQL中的种子获得实际的随机分布?

时间:2017-05-16 23:15:53

标签: sql sql-server

使用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中的种子生成真正的随机数?

2 个答案:

答案 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()将始终返回相同的结果。