生成从3到6的随机int值

时间:2011-10-24 15:47:44

标签: sql sql-server sql-server-2008

是否可以在Microsoft SQL Server中生成从Min到Max的随机int值(3-9示例,15-99 e.t.c)

我知道,我可以从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

10 个答案:

答案 0 :(得分:161)

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

ABS(CHECKSUM(NEWID()) % 10)

1到6

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

3到6

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

根据评论更新:

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

答案 1 :(得分:12)

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

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

这种方法的一些缺点是

  1. 这比NEWID()方法
  2. 即使每行评估一次,查询优化器也没有意识到这是can lead to odd results
  3. 但我以为我会把它添加为另一种选择。

答案 2 :(得分:7)

你可以这样做:

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

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

这是直接来自this link,我真的不知道如何给予这个答案适当的信任。

答案 3 :(得分: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。)

答案 4 :(得分: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.

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

答案 5 :(得分:4)

这是简单的单行代码

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

这是在两个数字(RETURN INT范围)

之间生成随机数的公式

这里a是你的第一个数字(Min),b是范围中的第二个数字(Max)

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

答案 6 :(得分:1)

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

答案 7 :(得分: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

答案 8 :(得分: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

答案 9 :(得分:0)

通常:

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

您的问题:

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

<=>

select rand()*3+3;