【发布时间】:2013-11-09 11:52:14
【问题描述】:
我有一些使用以下技术生成随机数的 SQL 代码:
DECLARE @Random1 INT, @Random2 INT, @Random3 INT, @Random4 INT, @Random5 INT, @Random6 INT, @Upper INT, @Lower INT
---- This will create a random number between 1 and 49
SET @Lower = 1 ---- The lowest random number
SET @Upper = 49; ---- The highest random number
with nums as (
select @lower as n
union all
select nums.n+1
from nums
where nums.n < @Upper
),
randnums as
(select nums.n, ROW_NUMBER() over (order by newid()) as seqnum
from nums
)
select @Random1 = MAX(case when rn.seqnum = 1 then rn.n end),
@Random2 = MAX(case when rn.seqnum = 2 then rn.n end),
@Random3 = MAX(case when rn.seqnum = 3 then rn.n end),
@Random4 = MAX(case when rn.seqnum = 4 then rn.n end),
@Random5 = MAX(case when rn.seqnum = 5 then rn.n end),
@Random6 = MAX(case when rn.seqnum = 6 then rn.n end)
from randnums rn;
select @Random1, @Random2, @Random3, @Random4, @Random5, @Random6
我的问题是这个数字生成有多随机?还有另一种更“随机”的方法吗?
我正在使用:
Microsoft SQL Server 2008 (SP3) - 10.0.5512.0 (X64) Aug 22 2012 19:25:47 Copyright (c) 1988-2008 Microsoft Corporation Developer Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)
大多数解决方案的问题是你最终会得到这样的值:14,29,8,14,27,27我不能有重复的数字!
【问题讨论】:
-
就像在您的 previous question 中一样,您可以使用
ORDER BY CRYPT_GEN_RANDOM(8)来返回“加密随机数” -
您是对的,将之前的答案标记为您的解决方案,并在此处为您投票。如果您可以在此处的答案中解释代码的工作原理,请将您标记为勾选:)
-
其实没有,因为你的方法仍然会导致欺骗出现:` 2,44,1,13,41,44`
-
那里的答案不符合这里的要求,即6个数字之间不能重复。为此,您可以在此处获取现有查询并将对
newid的引用更改为使用CRYPT_GEN_RANDOM。
标签: sql sql-server tsql