SQL随机数不起作用

时间:2009-06-24 14:21:19

标签: sql sql-server random

declare @fieldForceCounter as int
declare @SaleDate as dateTime
declare @RandomNoSeed as decimal

set @fieldForceCounter = 1
set @SaleDate = '1 Jan 2009'
set @RandomNoSeed = 0.0

WHILE @fieldForceCounter <= 3
   BEGIN

    while @SaleDate <= '1 Dec 2009' 
    begin       

        INSERT INTO MonthlySales(FFCode, SaleDate, SaleValue) VALUES(@fieldForceCounter, @SaleDate, RAND(@RandomNoSeed))

        set @saleDate = @saleDate + 1
        set @RandomNoSeed = Rand(@RandomNoSeed) + 1

    end

    set @SaleDate = '1 Jan 2009'
    set @fieldForceCounter = @fieldForceCounter + 1
   END
GO

此T-SQL命令应该在“SaleValue” - 表的“MonthlySales”列中插入随机值。

但每次都插入'1'。

可能是什么问题?

3 个答案:

答案 0 :(得分:4)

两个问题:

  • 首先,rand()函数返回0到1之间的数字。
  • 其次,当rand()在同一个查询中被多次调用时(例如,对于update语句中的多行),它通常返回相同的数字(我怀疑你上面的算法正在尝试通过将其分成多个调用来解决)

我最喜欢的第二个问题是使用一个保证每次返回一个唯一值的函数,比如newid(),将它转换为varbinary,并将其用作种子:)

编辑:经过一些测试后,您似乎需要尝试为@RandomNoSeed使用不同的数据类型; float的行为与decimal有些不同,但仍接近固定值,所以我建议完全避免使用@RandomNoSeed,只需使用:

INSERT INTO MonthlySales(FFCode, SaleDate, SaleValue) 
VALUES(@fieldForceCounter, @SaleDate, RAND(convert(varbinary,newid())))

答案 1 :(得分:2)

这里有重大问题......

十进制问题

十进制的默认精度/比例是38,0。所以你不存储任何小数部分。

所以你只使用RAND(0)进行第一次迭代,RAND(1)进行所有后续迭代,即0.943597390424144和0.713591993212924

我不记得舍入/截断是如何应用的,我不知道SalesValue的数据类型是什么,但舍入每次都会给出“1”。

现在,如果您修复此问题并正确声明小数...

播种问题

RAND采用整数种子。以1.0001或1.3或1.999播种得到相同的值(0.713591993212924)。

所以,“兰德(1.713591993212924)+ 1”=“兰德(1)+ 1”=“1.713591993212924”用于每次后续迭代。

回到原点...

修复

  • 摆脱@RandomNoSeed
  • 使用CHECKSUM(NEWID())
  • 生成随机整数值
  • 或:使用RAND()* CHECKSUM(NEWID())生成随机浮点值(现在不关心种子)

答案 2 :(得分:0)

只是一个猜测,但经常rand函数从0-1生成一个数字。尝试将随机数乘以10。