从数据库中获取随机数

3

编辑: 重复的问题,请参考如何在SQL Server 2005中返回随机数列?

你好,如何在mssql server 2005中生成随机数。

例如:当我从表中选择500行时,每一行必须有一个生成的随机数,在运行时生成这些数字。

更新: 我需要最快的方法,从大型表中生成数字,使用datepart、相同的魔术计算对于大量的行来说是相对较慢的。

更新:感谢答案,但我最终使用了这个解决方案。

SELECT ABS(CHECKSUM(NewId())) % 10 - 5 AS Random

今日免费次数已满, 请开通会员/明日再来

每个列都需要一个唯一的随机数吗? - edosoft
4个回答

3
SELECT TOP 500
    CONVERT(INT, CONVERT(VARBINARY(16), NEWID()))
FROM
    dbo.MyTable

你的查询产生了负数,这就是为什么我没有给它点赞的原因。 - Mitch Wheat
1
我没有意识到负数是不好的 :P ... 你可以用ABS()将其包装起来。 - Timothy Khouri

3

我喜欢这个技巧,它太棒了...

-- 500 random numbers from 0 to 499 
select top 500 ABS(CAST(CAST(NEWID() AS VARBINARY) AS int)) % 500 from sysobjects 

+1。我已经删除了我的错误答案! - Mitch Wheat
我很难过... 我第一个回答了,但没有得到加1分 :'( - Timothy Khouri
@Timothy,我只是为了好的结果给你投了一票,我发帖时没有看到你的回答,而且我有mod技巧。 - Sam Saffron
哈哈,我知道...时间真的很紧...我只是开玩笑(而且只哭了大约15秒) - Timothy Khouri

0

了解您需要随机数的原因可能会有所帮助。例如,如果您只想随机排序结果,可以使用ORDER BY NEWID()而不必担心生成随机数。如果您确实需要稍后使用随机数,请使用@Tim引用的解决方案。


0

易谷歌1 2 ...


在SELECT语句中返回随机数
当前SQL Server中的RAND()函数实现方式是,无法让你在SELECT语句中每一行返回不同的随机数。例如,如果执行以下代码:
SELECT Rand() as RandomNumber, *
FROM Northwind..Customers

你会看到同一个数字一遍又一遍。但有时,您可能希望在 SELECT 中的每一行返回一个随机生成的数字。以下是一种在 SQL Server 2000 中使用 UDF 实现此目的的方法。

首先,我们需要创建一个视图,返回一个随机数:

CREATE VIEW vRandNumber
AS
SELECT RAND() as RandNumber

视图是必要的,因为通常在UDF中我们不能使用rand()函数,因为那会使函数变得不确定。我们可以通过使用视图来欺骗UDF接受一个随机数。

一旦设置好了,我们就可以创建我们的函数:

CREATE FUNCTION RandNumber()
RETURNS float
AS
  BEGIN
  RETURN (SELECT RandNumber FROM vRandNumber)
  END

最后,您可以在任何SELECT中使用此函数,以便每行返回0到1之间的随机数:
SELECT dbo.RandNumber(), *
FROM Northwind..Customers

如果您喜欢,您可以在RandNumber函数中接受种子或允许范围参数,以使其更加高级:

CREATE FUNCTION RandNumber2(@Min int, @Max int)
RETURNS float
AS
 BEGIN
 RETURN @Min + (select RandNumber from RetRandNumber) * (@Max-@Min)
 END

这只是我的想法还是这些简单易搜答案最终会堵塞SO并使寻找那些有价值的难以搜索的信息更加困难? - Tim
1
真的,很容易在谷歌上找到...但你找到的解决方案比它们需要的要复杂得多。 - Timothy Khouri
看了一下回答,我猜那是有效的。最近看到了太多琐碎的问题,所以有些误判了。仔细检查后发现这不是其中之一。 - Tim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接