生成3到6之间的随机整数值


101

是否有可能在Microsoft SQL Server中生成从最小值到最大值的随机int值(例如3-9,例如15-99等)

我知道,我可以从0生成最大值,但是如何增加最小值边框?

该查询生成从1到6的随机值。需要将其从3更改为6。

SELECT table_name, 1.0 + floor(6 * RAND(convert(varbinary, newid()))) magic_number 
FROM information_schema.tables

5秒后添加

愚蠢的问题,对不起...

SELECT table_name, 3.0 + floor(4 * RAND(convert(varbinary, newid()))) magic_number 
FROM information_schema.tables

1
仅在您具有表的管理员类型权限的情况下,那里的答案才有效。我解决此问题的方法是使用字段上的主键作为种子。发行并不出色,但达到了目的。
2014年

Answers:


196

这将生成一个0-9之间的随机数

SELECT ABS(CHECKSUM(NEWID()) % 10)

1至6

SELECT ABS(CHECKSUM(NEWID()) % 6) + 1

3至6

SELECT ABS(CHECKSUM(NEWID()) % 4) + 3

动态的(基于Eilert Hjelmeseths的评论)

SELECT ABS(CHECKSUM(NEWID()) % (@max - @min + 1)) + @min

根据评论更新:

  • NEWID 生成随机字符串(对于返回的每一行)
  • CHECKSUM 取字符串值并创建数字
  • 模数(%)除以该数字并返回余数(表示最大值比您使用的数字小1)
  • ABS 将负面结果变为正面
  • 然后在结果中加1以消除0个结果(模拟骰子掷骰)

2
这帮了我很多!请记住,如果您尝试为批量插入生成随机密钥,这可能会导致重复,并且某些语句将失败。但是谢谢你!
Niklas

3
如果必须生成1到27之间的随机数怎么办?即范围大于9?
somegeek

4
如果我遵循逻辑,那么似乎可以通过此调整准确地轻松地动态设置范围。ABS(CHECKSUM(NEWID()) % (@max - @min + 1)) + @min。我的一些测试产生了良好的结果。如果确实准确,我认为可以通过包含此答案来稍稍改善。
Eilert Hjelmeseth

13

我看到您已经在SQL Server 2008中为您的问题添加了答案,您也可以

SELECT 3 + CRYPT_GEN_RANDOM(1) % 4 /*Random number between 3 and 6*/ 
FROM ...

这种方法的几个缺点是

  1. 这比NEWID()方法慢
  2. 即使每行对它进行一次评估,查询优化器也不会意识到这会导致奇怪的结果

但只是以为我会将其添加为另一种选择。


1
@ FSou1-是的。我认为CRYPT_GEN_RANDOM这确实适用于需要更安全加密的伪随机数的情况。
马丁·史密斯

7

你可以这样做:

DECLARE @maxval TINYINT, @minval TINYINT
select @maxval=24,@minval=5

SELECT CAST(((@maxval + 1) - @minval) *
    RAND(CHECKSUM(NEWID())) + @minval AS TINYINT)

这是直接从此链接获取的,我真的不知道该如何给这个答复以应有的重视。


5

漂亮又简单,来自Pinal Dave的网站:

http://blog.sqlauthority.com/2007/04/29/sql-server-random-number-generator-script-sql-query/

DECLARE @Random INT;
DECLARE @Upper INT;
DECLARE @Lower INT
SET @Lower = 3 ---- The lowest random number
SET @Upper = 7 ---- One more than the highest random number
SELECT @Random = ROUND(((@Upper - @Lower -1) * RAND() + @Lower), 0)
SELECT @Random

(我确实对@ Upper-进行了少许更改,以包括高位数字,加1。)


我在另一个帖子中看到了这个示例。它不提供随机分布。例如,Lower是1,Upper是11,所以我想要1到10之间的随机数。1和10的出现次数是2-8的一半。去测试一下。
nanonerd

4

只是:

DECLARE @MIN INT=3; --We define minimum value, it can be generated.
DECLARE @MAX INT=6; --We define maximum value, it can be generated.

SELECT @MIN+FLOOR((@MAX-@MIN+1)*RAND(CONVERT(VARBINARY,NEWID()))); --And then this T-SQL snippet generates an integer between minimum and maximum integer values.

您可以根据需要更改和编辑此代码。


1
尽管此代码段是受欢迎的,并且可以提供一些帮助,但是如果它包含有关如何解决该问题的说明,则将大大改善。否则,您的答案的教育价值就会大大降低-请记住,您将来会为读者回答问题,而不仅仅是现在问的人!请编辑您的答案以添加说明,并指出适用的限制和假设。
Toby Speight

4

这是简单的单行代码

为此,请使用SQL Inbuild RAND()函数。

这是在两个数字之间生成随机数的公式(返回整数范围)

这里a是您的第一个数字(最小值),b是第二个数字(最大值)

SELECT FLOOR(RAND()*(b-a)+a)

注意:您也可以使用CAST或CONVERT函数来获取INT范围编号。

(CAST(RAND()*(25-10)+10 AS INT))

例:

SELECT FLOOR(RAND()*(25-10)+10);

这是在两个数字之间生成随机数的公式(RETURN DECIMAL范围)

SELECT RAND()*(b-a)+a;

例:

SELECT RAND()*(25-10)+10;

有关更多详细信息,请检查以下内容:https : //www.techonthenet.com/sql_server/functions/rand.php


1
注意,如链接文章中所述,这实际上不会生成值= Max。为此,例如对于值> = 10和<= 25,您将需要SELECT FLOOR(RAND()*(25-10 + 1))+ 10
Shaun

1
SELECT ROUND((6 - 3 * RAND()), 0)

2
获得一个号码高于另一个号码的机会并不均等。检查此输出:SELECT ROUND((6 - 3 * 0.16), 0) SELECT ROUND((6 - 3 * 0.17), 0) SELECT ROUND((6 - 3 * 0.5), 0) SELECT ROUND((6 - 3 * 0.51), 0) SELECT ROUND((6 - 3 * 0.83), 0) SELECT ROUND((6 - 3 * 0.84), 0) 示出了对于6 16%的变化,〜34%为5,〜34%它是4和〜16%是3
麦克德克勒克

截断比取整更好
MichaelChirico

0

Lamak的答案是一个函数:

-- Create RANDBETWEEN function
-- Usage: SELECT dbo.RANDBETWEEN(0,9,RAND(CHECKSUM(NEWID())))
CREATE FUNCTION dbo.RANDBETWEEN(@minval TINYINT, @maxval TINYINT, @random NUMERIC(18,10))
RETURNS TINYINT
AS
BEGIN
  RETURN (SELECT CAST(((@maxval + 1) - @minval) * @random + @minval AS TINYINT))
END
GO

0
DECLARE @min INT = 3;
DECLARE @max INT = 6;
SELECT @min + ROUND(RAND() * (@max - @min), 0);

一步步

DECLARE @min INT = 3;
DECLARE @max INT = 6;

DECLARE @rand DECIMAL(19,4) = RAND();
DECLARE @difference INT = @max - @min;
DECLARE @chunk INT = ROUND(@rand * @difference, 0);
DECLARE @result INT = @min + @chunk; 
SELECT @result;

请注意,用户定义的函数因此不允许使用RAND()。一种解决方法(源:http : //blog.sqlauthority.com/2012/11/20/sql-server-using-rand-in-user-defined-functions-udf/)是首先创建一个视图。

CREATE VIEW [dbo].[vw_RandomSeed]
AS
SELECT        RAND() AS seed

然后创建随机函数

CREATE FUNCTION udf_RandomNumberBetween
(
    @min INT,
    @max INT
)
RETURNS INT
AS
BEGIN
    RETURN @min + ROUND((SELECT TOP 1 seed FROM vw_RandomSeed) * (@max - @min), 0);
END

0

一般来说:

select rand()*(@upper-@lower)+@lower;

对于您的问题:

select rand()*(6-3)+3;

<=>

select rand()*3+3;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.