【问题标题】:SQL Random number not workingSQL 随机数不起作用
【发布时间】:2010-11-05 12:54:41
【问题描述】:
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 命令应该在“MonthlySales”表的“SaleValue”列中插入随机值。

但它每次都插入'1'。

可能是什么问题?

【问题讨论】:

    标签: sql sql-server random


    【解决方案1】:

    这里有大问题...

    小数问题

    十进制的默认精度/小数位数为 38,0。所以你没有存储任何小数部分。

    因此,您仅将 RAND(0) 用于第一次迭代,将 RAND(1) 用于所有后续迭代,即 0.943597390424144 和 0.713591993212924

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

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

    种子问题

    RAND 采用 integer 种子。使用 1.0001 或 1.3 或 1.999 播种会产生相同的值 (0.713591993212924)。

    因此,对于每个后续迭代,"Rand(1.713591993212924) + 1" = "RAND(1) + 1" = "1.713591993212924"。

    回到第一格...

    修复

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

    【讨论】:

      【解决方案2】:

      两个问题:

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

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

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2014-05-12
          • 2011-01-19
          • 1970-01-01
          • 2021-03-29
          • 2013-04-13
          • 2011-07-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多