从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 ...
这种方法的一些缺点是
- 这比
NEWID()
方法慢 - 即使每行评估一次,查询优化器也没有意识到这会导致奇怪的结果 。
但只是想我会添加它作为另一种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