积极答复者
如何一次插入十个随机值

问题
-
我建了一张表,有一个字段是VC_FD_NO 是主键
我插入10条测试数据
USE [Monitoring] GO DECLARE @a INT SET @a=1 INSERT [dbo].[CT_Dis_FuelingData] SELECT CAST((CAST(RAND(10)*9999 AS INT)+1)AS VARCHAR(10)), CAST(RAND(10)*10 AS INT) , '93#', CAST(RAND(100)*100 AS DECIMAL(18,2)), 7.5, CAST(RAND(100)*100 AS DECIMAL(18,2)), 0, '2012-11-19 00:12:12', '201211191255', '2012-11-19', 0, @a+1 GO 10
测试数据都是在SSMS里执行的
CAST((CAST(RAND(10)*9999 AS INT)+1)AS VARCHAR(10))
不知道为什么无论我怎麽执行这句话的随即值都是不变的,都是7137这个值,是不是要在SSMS里新建一个查询窗口才改变,换句话说是不是在同一个连接里随机值无论执行多少次都是
不变的?
答案
-
联机丛书说得很清楚:
RAND 函数是伪随机数生成器,它将以类似于 C 运行时库 rand 函数的方式进行运算。如果没有提供种子值,系统将生成它自己的可变种子值。如果用某个种子值调用 RAND,则必须使用可变种子值来生成随机数。如果用同一种子值多次调用 RAND,它将返回同一生成值。在以下脚本中,对 RAND 的多次调用将返回同一值,这是因为它们都使用了同一种子值:
<//img>复制代码
SELECT RAND(159784); SELECT RAND(159784); SELECT RAND(159784);
从 RAND 生成随机数的常用方法是,用相对可变的某个值作为种子值,例如将 GETDATE 的几个部分累加:
<//img>复制代码
SELECT RAND( (DATEPART(mm, GETDATE()) * 100000 ) + (DATEPART(ss, GETDATE()) * 1000 ) + DATEPART(ms, GETDATE()) );
你这个需求可以不用种子,或者每次用上次的值作为种子。
想不想时已是想,不如不想都不想。
- 已建议为答案 TerryChuang 2012年11月19日 6:23
- 已标记为答案 Steven.桦仔 2012年11月19日 12:01
-
或许你可以参考艾小克的这篇文章,其中有提到多种做法来产生随机值。
http://www.dotblogs.com.tw/chhuang/archive/2008/03/18/1883.aspx
以上說明若有錯誤請指教,謝謝。
歡迎參觀我的BLOG - 積沙成塔- 已标记为答案 Steven.桦仔 2012年11月19日 12:01
全部回复
-
联机丛书说得很清楚:
RAND 函数是伪随机数生成器,它将以类似于 C 运行时库 rand 函数的方式进行运算。如果没有提供种子值,系统将生成它自己的可变种子值。如果用某个种子值调用 RAND,则必须使用可变种子值来生成随机数。如果用同一种子值多次调用 RAND,它将返回同一生成值。在以下脚本中,对 RAND 的多次调用将返回同一值,这是因为它们都使用了同一种子值:
<//img>复制代码
SELECT RAND(159784); SELECT RAND(159784); SELECT RAND(159784);
从 RAND 生成随机数的常用方法是,用相对可变的某个值作为种子值,例如将 GETDATE 的几个部分累加:
<//img>复制代码
SELECT RAND( (DATEPART(mm, GETDATE()) * 100000 ) + (DATEPART(ss, GETDATE()) * 1000 ) + DATEPART(ms, GETDATE()) );
你这个需求可以不用种子,或者每次用上次的值作为种子。
想不想时已是想,不如不想都不想。
- 已建议为答案 TerryChuang 2012年11月19日 6:23
- 已标记为答案 Steven.桦仔 2012年11月19日 12:01
-
或许你可以参考艾小克的这篇文章,其中有提到多种做法来产生随机值。
http://www.dotblogs.com.tw/chhuang/archive/2008/03/18/1883.aspx
以上說明若有錯誤請指教,謝謝。
歡迎參觀我的BLOG - 積沙成塔- 已标记为答案 Steven.桦仔 2012年11月19日 12:01