【发布时间】:2009-11-01 15:47:42
【问题描述】:
我正在编写一个程序,每次调用都需要获取一个随机数。这个过程是从我们的 .net Web 服务调用的。
我尝试使用 rand() 来实现它。但是,当我在几毫秒内多次调用存储过程时,我会遇到很多冲突,因为正在生成相同的随机数。如果后续调用之间有大约 20 或 30 毫秒的间隔,它似乎工作正常。
似乎 rand() 被 SqlServer 重新植入每个存储过程调用。据我了解,这是一个问题,因为一个随机数生成器应该播种一次,并且如果一个人重新播种对 rand 的每个调用,则不会得到一个好的伪随机数序列。此外,在 1 或 2 毫秒内对同一个 sp 的调用似乎得到了相同的值。
这是存储过程中的语句本身。
DECLARE @randomNumber char(9)
SET @randomNumber = RIGHT('00000' + CAST(CAST(rand()*100000 AS INT) AS VARCHAR(5)),5)
+ RIGHT('00000' + CAST(CAST(rand()*10000 AS INT) AS VARCHAR(4)),4)
有人有解决此问题的建议吗?
我是否必须编写自己的随机数生成器,该生成器只播种一次并将其状态保存在跨调用的表中? SQL Server 如何播种 rand()?它是真正随机的,还是如果您在单独的连接上彼此在 1 或 2 毫秒内调用一个 sp,是否会使用相同的种子播种,从而导致冲突?
【问题讨论】:
-
您是否尝试过编写CLR存储过程并使用.NET框架的随机数能力?
标签: sql-server random