random怎么读,random函数的用法

  

  各位朋友,我们平时写SQL脚本的时候,很多时候,都是理所当然的。在某些情况下,我们可能需要一些随机数据。比如我们要写一个抽奖程序,需要随机返回某个数字,那么我们可以用SQL中的random函数来实现。   

  

     

  

  SQL Server中有一个数学函数RAND,可以用于返回一个介于0 到1(不包括0和1)之间的伪随机float值.我们先来看看RAND函数的语法结构:   

  

  RAND (seed)非常简单,包括一个可选参数seed,可以为RAND函数预设种子。对于指定的种子值,返回的结果总是相同的。如果没有设置种子值,系统将自动随机地为RAND函数分配一个种子值。为了返回随机数据,我们一般不使用这个参数。   

  

  为了验证RAND函数的返回值确实足够随机,我们先做一点测试,用while循环返回10个随机数。脚本如下:   

  

  declare @ I int=1;while @i=10开始打印RAND();set @ I=1;结束;操作效果如下:   

  

     

  

  可见随机数确实足够随机,可以放心使用。我们以彩票需求为例。比如从1001到1500有500个数字。怎样才能用SQL脚本实现抽奖过程?   

  

  既然RAND的返回值是0~1,不包含浮点数0和1,那么如果我们把RAND的返回值乘以1500会有什么影响?这是一个简单的数学概念,这个随机数的取值范围变成了一个从0到1500的浮点数,不包括0和1500。   

  

  要将浮点数转换成整数,我们可以使用round或floor和ceiling函数。既然我们也想给边界值1500一个命中的机会,那么我们最好使用ceiling函数,它返回大于等于浮点数的最小整数值。   

  

  我们要的是1001到1500之间的随机整数,返回值更可能是1到1000之间的整数。为了过滤掉无效的部分,我们需要使用while循环触碰1001到1500之间的范围。   

  

  脚本如下:   

  

  declare @ begno int=1001declare @ endno int=1500declare @ result int=0;while 1=1 begin set @ result=ceiling(rand()* @ endno);if @result=@begno和@ result=@ endno begin print @ result;打破;结束;结束;怎么样?是不是很简单?我们来看看运行效果:   

  

     

  

  为了增加脚本的可重用性,我们可以将上述脚本转换为自定义函数。脚本如下:   

  

  -create view getrand as select rand()as rand;-创建自定义函数创建函数Chou Jiang (@ begno int=1001,@ endno int=1500)返回int as begin declare @ result int=0;while 1=1 begin select @ result=ceiling(* @ endno)from getrand;if @result=@begno和@ result=@ endno begin break结束;结束;返回@结果;结束;眼尖的朋友会看到,在创建自定义函数时,我们首先创建了一个简单的视图,因为在自定函数中,是无法直接调用诸如RAND这类没有确定值的系统函数的.除了RAND函数之外,GETDATE等系统函数不能直接用在自定义函数中。创建视图是最简单的解决方案。   

  

  让我们调用这个函数几次,看看返回值。脚本如下:   

  

  declare @ I int=1;而@ I=20 begin print dbo . Chou Jiang(1001,1500);set @ I=1;结束;我们来看看运行效果:   

  

     

  

  怎么样?用SQL脚本简单实现了一个简单的彩票程序。有意思!   

相关文章