SQL Server-兰德() - 范围

时间:2014-02-15 14:15:19

标签: random sql-server-2012

我想创建1到99,999,999之间的随机数。

我使用以下代码:

SELECT CAST(RAND() * 100000000 AS INT) AS [RandomNumber]

但是我的结果总是介于7和8的长度之间,这意味着我从未看到过低于1,000,000的值。

有没有办法在定义的范围之间生成随机数?

2 个答案:

答案 0 :(得分:6)

  

RAND返回从0到1的伪随机浮点值, exclusive

所以RAND() * 100000000完全符合你的需要。然而,假设1到99,999,999之间的每个数字确实具有相同的概率,那么中99%的数字可能在7到8的长度之间,因为这些数字更常见。

+--------+-------------------+----------+------------+
| Length |       Range       |  Count   |  Percent   |
+--------+-------------------+----------+------------+
|      1 | 1-9               |        9 |  0.000009  |
|      2 | 10-99             |       90 |  0.000090  |
|      3 | 100-999           |      900 |  0.000900  |
|      4 | 1000-9999         |     9000 |  0.009000  |
|      5 | 10000-99999       |    90000 |  0.090000  |
|      6 | 100000-999999     |   900000 |  0.900000  |
|      7 | 1000000-9999999   |  9000000 |  9.000000  |
|      8 | 10000000-99999999 | 90000000 | 90.000001  |
+--------+-------------------+----------+------------+

答案 1 :(得分:1)

我创建了一个可能有用的功能。你需要发送Rand()函数才能使它工作。

创建功能[dbo]。[RangedRand] (      @MyRand浮动     ,@ Lower bigint = 0     ,@ Upper bigint = 999 ) 返回bigint 如 开始     DECLARE @Random BIGINT

SELECT @Random = ROUND(((@Upper - @Lower) * @MyRand + @Lower), 0)

RETURN @Random

END

GO

- 这是它的工作原理。

- 为随机值创建测试表

创建表#MySample (  RID INT IDENTITY(1,1)主键 ,MyValue bigint ) GO


- 让我们使用该函数填充值列

插入#MySample (myvalue的)

SELECT dbo.RangedRand(RAND(),0,100) GO 1000


- 让我们看看我们得到了什么。

SELECT RID,MyValue 来自#MySample --ORD by MyValue - 使用此" Order By"看随机值的分布


- 让我们再次使用该函数从表中获取随机行

DECLARE @MyMAXID int SELECT @MyMAXID = MAX(RID) 来自#MySample

SELECT RID,MyValue 来自#MySample WHERE RID = dbo.RangedRand(RAND(),1,@ MyMAXID)


DROP TABLE #MySample

- 我希望这有帮助。