2017-05-16 36 views
0

使用SQL Server,我需要得到随机数,但每次运行代码时都需要相同的结果。通常情况下,这将意味着使用种子,但据我所知,SQL的RAND函数使用公式:有没有办法从SQL中的种子获得实际的随机分布?

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

您可以使用NEWID()和兰德如下10000号

select convert(int,rand(convert(varbinary,newid()))*@seed) 

插入随机数字,而不是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 
+0

每次调用相同种子 – Evan

+0

时,都不会得到相同的结果您需要相同的结果吗? –

+0

“种子”一词应该对你有所帮助。从技术上讲,电脑时钟也是种子,但现在让我们忽略它。 ;) –

0

你错过了种子的点。

您只能使用第一个调用RAND()的种子参数。后续的调用不应该使用参数。

阅读docs

具有相同种子值的RAND()的重复调用返回相同的结果。 对于一个连接,如果使用指定的种子值调用RAND(),则所有随后的RAND()调用都会根据种子的RAND()调用生成结果。

显示的示例SELECT RAND(100), RAND(), RAND()将始终返回相同的结果。

+0

虽然你的回答中的事实是正确的,但我认为OP的问题是关于SQLServer的RAND()的随机性问题。从这个问题引用,“你知道,整数被截断,不是特别随机。” –

相关问题