我想创建1到99,999,999之间的随机数。
我使用以下代码:
SELECT CAST(RAND() * 100000000 AS INT) AS [RandomNumber]
但是我的结果总是介于7和8的长度之间,这意味着我从未看到过低于1,000,000的值。
有没有办法在定义的范围之间生成随机数?
答案 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
- 我希望这有帮助。