Как генерировать числа с нормальным распределением в SQL Server

Я пытаюсь засеять некоторые данные, есть ли способ генерировать числа в SQL Server, которые следуют нормальной кривой распределения?

Например: я укажу среднее значение, стандартное отклонение и количество, и я получу список чисел обратно?


person Mel    schedule 16.05.2012    source источник


Ответы (3)


цитата из http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=135026 вы можете попробовать

CREATE FUNCTION [dbo].[udf_NORMSDIST]
(
            @x FLOAT
)
RETURNS FLOAT
AS
/****************************************************************************************
NAME: udf_NORMSDIST
WRITTEN BY: rajdaksha
http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=135026
DATE: 2009/10/29 
PURPOSE: Mimics Excel's Function NORMSDIST

Usage: SELECT dbo.udf_NORMSDIST(.5)


REVISION HISTORY

Date Developer Details
2010/08/11 LC Posted Function


*****************************************************************************************/

BEGIN 
DECLARE @result FLOAT
DECLARE @L FLOAT
DECLARE @K FLOAT
DECLARE @dCND FLOAT
DECLARE @pi FLOAT
DECLARE @a1 FLOAT
DECLARE @a2 FLOAT
DECLARE @a3 FLOAT
DECLARE @a4 FLOAT
DECLARE @a5 FLOAT

--SELECT @L = 0.0
SELECT @K = 0.0
SELECT @dCND = 0.0

SELECT @a1 = 0.31938153
SELECT @a2 = -0.356563782
SELECT @a3 = 1.781477937
SELECT @a4 = -1.821255978
SELECT @a5 = 1.330274429
SELECT @pi = 3.1415926535897932384626433832795

SELECT @L = Abs(@x)

IF @L >= 30
BEGIN
IF sign(@x) = 1
SELECT @result = 1
ELSE
SELECT @result = 0
END
ELSE
BEGIN
-- perform calculation
SELECT @K = 1.0 / (1.0 + 0.2316419 * @L)
SELECT @dCND = 1.0 - 1.0 / Sqrt(2 * @pi) * Exp(-@L * @L / 2.0) *
(@a1 * @K + @a2 * @K * @K + @a3 * POWER(@K, 3.0) + @a4 * POWER(@K, 4.0) + @a5 * POWER (@K, 5.0))
IF (@x < 0)
SELECT @result = 1.0 - @dCND
ELSE
SELECT @result = @dCND

END

RETURN @result
END

Очевидно, вы можете сместить результаты, чтобы изменить среднее значение, и обернуть это в функцию, которая будет выполнять итерацию по мере необходимости, чтобы вернуть желаемое количество точек выборки. Дайте мне знать, если вам нужна помощь для этого.

person eddo    schedule 16.05.2012

случайное нормальное распределение

UPDATE TABLE 
SET COLUMN = CAST(SQRT(-2*LOG(RAND()))*SIN(2*PI()*RAND(CHECKSUM(NEWID())))as decimal(5,3))    
from TABLE
person AaronConnell    schedule 20.11.2013
comment
Не могли бы вы немного объяснить свое решение? - person damienfrancois; 21.11.2013
comment
@damienfrancois Конечно, я только что изменил эту формулу - person AaronConnell; 21.11.2013

Например (глупый анализатор тела SO): http://www.sqlservercentral.com/articles/SQL+Uniform+Random+Numbers/91103

person Ofigenn    schedule 12.10.2016