从3到6生成随机的int值

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

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

这个查询从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 

这会产生一个0-9之间的随机数

 ABS(Checksum(NewID()) % 10) 

1至6

 ABS(Checksum(NewID()) % 6) + 1 

3日至6日

 ABS(Checksum(NewID()) % 4) + 3 

根据意见更新:

  • NewID生成随机string(对于每行返回)
  • 校验和取值为string并创build数字
  • 模数(%)除以该数字并返回余数(意思是最大值比您使用的数字小1)
  • ABS将负面结果改为正面
  • 然后添加一个结果来消除0结果(模拟骰子滚动)

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

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

这种方法的一些缺点是

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

但只是想我会添加它作为另一种select。

你可以这样做:

 DECLARE @maxval TINYINT, @minval TINYINT select @maxval=24,@minval=5 SELECT CAST(((@maxval + 1) - @minval) * RAND(CHECKSUM(NEWID())) + @minval AS TINYINT) 

这是直接从这个环节 ,我真的不知道如何给这个答案适当的功劳。

从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 

(我做了一个稍微改变@上 – 包括上面的数字,加1。

只是:

 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. 

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

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

拉玛克的答案是:

 -- 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 
 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/ )是首先创build一个视图。

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

然后创build随机函数

 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