在batch里边rand([seed])对rand()的影响

TheGodOfGods 2010-06-21 12:05:56
语句SELECT RAND(10),RAND()执行多次时,为何每次rand()列值都相同?


DECLARE @counter smallint;
SET @counter = 1;
WHILE @counter < 4
BEGIN
/* case 1:
SELECT RAND() Random_Number
*/
/* case 2:
select rand(10)
*/
--/* case 3:
select rand(10) Random_WithSeed, RAND() Random_Number
--*/
SET @counter = @counter + 1
END;
GO
/*
case 1 结果: 每次调用rand()返回值不同

Random_Number
----------------------
0.728291256646099
(1 行受影响)
Random_Number
----------------------
0.590118475510385
(1 行受影响)
Random_Number
----------------------
0.611138172806976
(1 行受影响)
*/

/*
case 2结果:由于给定 seed值,因此每次返回值相同

----------------------
0.713759689954247
(1 行受影响)
----------------------
0.713759689954247
(1 行受影响)
----------------------
0.713759689954247
(1 行受影响)
*/

/*
case 3结果: 显然rand([seed])对rand()调用造成影响,因为每次rand()值都相同
Random_WithSeed Random_Number
---------------------- ----------------------
0.713759689954247 0.182458908613686
(1 行受影响)
Random_WithSeed Random_Number
---------------------- ----------------------
0.713759689954247 0.182458908613686
(1 行受影响)
Random_WithSeed Random_Number
---------------------- ----------------------
0.713759689954247 0.182458908613686
(1 行受影响)
*/
...全文
92 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
TheGodOfGods 2010-07-30
  • 打赏
  • 举报
回复
Zoezs 2010-06-21
  • 打赏
  • 举报
回复
试试这样搞

declare @i int
set @i=0
while(@i<10)
begin
SELECT RAND((DATEPART(mm,GETDATE())*100000)
+ DATEPART(ss,GETDATE())*1000
+ DATEPART(ms,GETDATE()))
waitfor delay '00:00:00.01'
set @i=@i+1
end
xiaoliaoyun 2010-06-21
  • 打赏
  • 举报
回复
联机丛书:

注释
使用同一个种子值重复调用 RAND() 会返回相同的结果。

对于一个连接,如果使用指定的种子值调用 RAND(),则 RAND() 的所有后续调用将基于使用该指定种子值的 RAND() 调用生成结果。例如,以下查询将始终返回相同的数字序列。

SELECT RAND(100), RAND(), RAND()
TheGodOfGods 2010-06-21
  • 打赏
  • 举报
回复
我也是注意到那句注释了。。。
但好像还是没法解释case 1跟case3这两种情况产生的区别吧。
1.明显case 1是与注释相违背的,因为它多次调用rand()产生的值都不同
2.在单个查询中既有rand(),又有rand([seed]),rand()产生的结果才与注释说的一样
永生天地 2010-06-21
  • 打赏
  • 举报
回复
RAND
返回 0 到1 之间的随机float 值。

语法
RAND ( [ seed ] )

参数
seed

是给出种子值或起始值的整型表达式(tinyint、smallint 或 int)。

返回类型
float

注释
在单个查询中反复调用 RAND() 将产生相同的值。

示例
下例产生 4 个通过 RAND 函数产生的不同的随机值。

DECLARE @counter smallint
SET @counter = 1
WHILE @counter < 5
BEGIN
SELECT RAND(@counter) Random_Number
SET NOCOUNT ON
SET @counter = @counter + 1
SET NOCOUNT OFF
END
GO

下面是结果集:

Random_Number
-------------------
0.71359199321292355

(1 row(s) affected)

Random_Number
-------------------
0.7136106261841817

(1 row(s) affected)

Random_Number
-------------------
0.71362925915543995

(1 row(s) affected)

Random_Number
-------------------
0.7136478921266981

(1 row(s) affected)

feilniu 2010-06-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 xiaoliaoyun 的回复:]

联机丛书:

注释
使用同一个种子值重复调用 RAND() 会返回相同的结果。

对于一个连接,如果使用指定的种子值调用 RAND(),则 RAND() 的所有后续调用将基于使用该指定种子值的 RAND() 调用生成结果。例如,以下查询将始终返回相同的数字序列。

SELECT RAND(100), RAND(), RAND()
[/Quote]
UP
虽然我在SS2005的联机丛书上也没找到。但这个说明符合通过种子值生成伪随机数的机制。

如果LZ想要在一个语句中生成多个不重复的随机值,在SS2005以后使用ABS(CHECKSUM(NEWID()))是个不错的方法:

SELECT n,r1=ABS(CHECKSUM(NEWID())),r2=ABS(CHECKSUM(NEWID())),r3=ABS(CHECKSUM(NEWID()))
FROM Nums
WHERE n BETWEEN 1 AND 10
TheGodOfGods 2010-06-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 xiaoliaoyun 的回复:]

联机丛书:

注释
使用同一个种子值重复调用 RAND() 会返回相同的结果。

对于一个连接,如果使用指定的种子值调用 RAND(),则 RAND() 的所有后续调用将基于使用该指定种子值的 RAND() 调用生成结果。例如,以下查询将始终返回相同的数字序列。

SELECT RAND(100), RAND(), RAND()
[/Quote]

你这个是SQLServer0几的? 我查的05没你上边说这句

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧