生成从3到6的随机int值

FSo*_*ou1 94 sql sql-server sql-server-2008

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

我知道,我可以生成从0到Max,但是如何增加Min边界?

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

SELECT table_name, 1.0 + floor(6 * RAND(convert(varbinary, newid()))) magic_number 
FROM information_schema.tables
Run Code Online (Sandbox Code Playgroud)

5秒后添加:

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

SELECT table_name, 3.0 + floor(4 * RAND(convert(varbinary, newid()))) magic_number 
FROM information_schema.tables
Run Code Online (Sandbox Code Playgroud)

org*_*ger 180

这会生成0-9之间的随机数

ABS(CHECKSUM(NEWID()) % 10)
Run Code Online (Sandbox Code Playgroud)

1到6

ABS(CHECKSUM(NEWID()) % 6) + 1
Run Code Online (Sandbox Code Playgroud)

3到6

ABS(CHECKSUM(NEWID()) % 4) + 3
Run Code Online (Sandbox Code Playgroud)

根据评论更新:

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

  • 如果我遵循逻辑,那么似乎可以通过此调整准确地轻松地动态设置范围。`ABS(CHECKSUM(NEWID())%(@max-@min + 1))+ @ min`。我的一些测试产生了良好的结果。如果确实准确,我认为可以通过包含该答案来稍微改善此答案。 (3认同)
  • 这帮了我很多!请记住,如果您尝试为批量插入生成随机密钥,这可能会导致重复,并且某些语句将失败。但是谢谢你! (2认同)
  • 如果我必须生成1到27之间的随机数怎么办?即范围大于9? (2认同)

Mar*_*ith 13

我看到你在SQL Server 2008中添加了问题的答案,你也可以这样做

SELECT 3 + CRYPT_GEN_RANDOM(1) % 4 /*Random number between 3 and 6*/ 
FROM ...
Run Code Online (Sandbox Code Playgroud)

这种方法的一些缺点是

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

但只是想我会把它添加为另一种选择.


Lam*_*mak 7

你可以这样做:

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

SELECT CAST(((@maxval + 1) - @minval) *
    RAND(CHECKSUM(NEWID())) + @minval AS TINYINT)
Run Code Online (Sandbox Code Playgroud)

这是直接来自这个链接,我真的不知道如何给予这个答案适当的信誉.


小智 7

这是简单的单行代码

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

这是在两个数字之间生成随机数的公式(RETURN INT Range)

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

SELECT FLOOR(RAND()*(b-a)+a)
Run Code Online (Sandbox Code Playgroud)

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

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

例子:

SELECT FLOOR(RAND()*(25-10)+10);
Run Code Online (Sandbox Code Playgroud)

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

SELECT RAND()*(b-a)+a;
Run Code Online (Sandbox Code Playgroud)

例子:

SELECT RAND()*(25-10)+10;
Run Code Online (Sandbox Code Playgroud)

更多细节请查看:https : //www.techonthenet.com/sql_server/functions/rand.php

  • 请注意,正如链接文章中提到的,这实际上不会生成值= Max。例如,要执行此操作,对于值 >= 10 和 <= 25,您需要 SELECT FLOOR(RAND()*(25-10+1))+10 (3认同)

Adr*_*arr 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
Run Code Online (Sandbox Code Playgroud)

(我确实对@ Upper-略有改动,包括上面的数字,加上1.)


MER*_*ĞAN 5

简单地:

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.
Run Code Online (Sandbox Code Playgroud)

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