2015-07-02 53 views
0

我不知道是否有人知道如何在均匀分布的范围内生成Sql Server中的随机值。这是我做过什么:统一分布随机

SELECT ID, AlgorithmType, AlgorithmID 
FROM TEvaluateAlgorithm 

我想AlgorithmID取值为0〜15,具有均匀分布

UPDATE TEA SET TEA.AlgorithmID = FLOOR(RAND(CONVERT(VARBINARY, NEWID()))*(16)) 
-- FROM TEvaluateAlgorithm TEA 

我不知道与随机发生什么,但不分配均匀0和15之间的随机值,而不是相同的数量。 例如从0到9大于从10到15.

在此先感谢!

编辑:

这里是我的数据就可以看到区别...

AlgorithmID COUNT(*) 

    0 22254 
    1 22651 
    2 22806 
    3 22736 
    4 22670 
    5 22368 
    6 22690 
    7 22736 
    8 22646 
    9 22536 
    10 14479 
    11 14787 
    12 14553 
    13 14546 
    14 14574 
    15 14722 
+2

如果它是均匀分布的,那么随机性是多少? – Kaf

+1

我认为他的意思是即使在大数据量的情况下也是如此。 – LDMJoe

+0

你能显示一些数据吗? – Kaf

回答

2

rand()没有做好这一点。因为你想要的整数,我建议如下:

select abs(checksum(newid()) % 16 

我只是检查这个使用:

select val, count(*) 
from (select abs(checksum(newid()) % 16 
     from master..spt_values 
    ) t 
group by val 
order by val; 

和分配看起来是合理的。

+0

是的,我认为是正确的一点! – user2112420

+0

我已阅读此帖,http://stackoverflow.com/questions/1045138/how-do-i-generate-random-number-for-each-row-in-a-tsql-select他说有一个非常代码中存在轻微的偏见。 – user2112420

0

下面是一个概念的快速证明。

@Loops设置为足够大以使统计数据有意义。 50k似乎是一个体面的起点。

@MinValue设置为您的集合中的最小整数,并将@TotalValues设置为您希望集合中有多少个整数。正如问题中所指出的那样,0和16会得到16个值[0-15]

我们将使用随机函数50K输出硬塞到一个临时表,然后在其上运行一些统计...

DECLARE @MinValue int 
DECLARE @TotalValues int 

SET @MinValue = 0 
SET @TotalValues = 16 

DECLARE @LoopCounter bigint 
SET @LoopCounter = 0 

DECLARE @Loops bigint 
SET @Loops = 50000 

CREATE TABLE #RandomValues 
(
    RandValue int 
) 

WHILE @LoopCounter < @Loops 
    BEGIN 

     INSERT INTO #RandomValues (RandValue) VALUES (FLOOR(RAND()*(@[email protected])[email protected])) 
     --you can plug into the right side of the above equation any other randomize formula you want to test 
     SET @LoopCounter = @LoopCounter + 1 

    END 


--raw data query 
SELECT 
    RandValue AS [Value], 
    COUNT(RandValue) AS [Occurrences], 
    ((CONVERT(real, COUNT(RandValue)))/CONVERT(real, @Loops)) * 100.0 AS [Percentage] 
FROM 
    #RandomValues 
GROUP BY 
    RandValue 
ORDER BY 
    RandValue ASC 

--stats on your random query 

SELECT 
    MIN([Percentage]) AS [Min %], 
    MAX([Percentage]) AS [Max %], 
    STDEV([Percentage]) AS [Standard Deviation] 
FROM 
    ( 
    SELECT 
     RandValue AS [Value], 
     COUNT(RandValue) AS [Occurrences], 
     ((CONVERT(real, COUNT(RandValue)))/CONVERT(real, @Loops)) * 100.0 AS [Percentage] 
    FROM 
     #RandomValues 
    GROUP BY 
     RandValue 
    --ORDER BY 
    -- RandValue ASC 
    ) DerivedRawData 

DROP TABLE #RandomValues 

请注意,您可以在任何其他的随机化公式中插入在WHILE循环内的INSERT声明的右侧然后重新运行以查看您是否更喜欢结果。 “均匀分布”有点儿主观,但标准偏差结果可以量化,您可以确定它是否可接受。

+0

没有任何反馈,只是downvote?确切地说,这对于证明或否定如何“均匀分布”随机函数的行为没有帮助? – LDMJoe