2013-11-09 3 views
3

У меня есть некоторые SQL код, который генерирует случайные числа, используя следующую методику:Создание уникальных случайных чисел с помощью SQL

DECLARE @Random1 INT, @Random2 INT, @Random3 INT, @Random4 INT, @Random5 INT, @Random6 INT, @Upper INT, @Lower INT 
---- This will create a random number between 1 and 49 
SET @Lower = 1 ---- The lowest random number 
SET @Upper = 49; ---- The highest random number 


with nums as (
    select @lower as n 
    union all 
    select nums.n+1 
    from nums 
    where nums.n < @Upper 
    ), 
    randnums as 
    (select nums.n, ROW_NUMBER() over (order by newid()) as seqnum 
    from nums 
    ) 
select @Random1 = MAX(case when rn.seqnum = 1 then rn.n end), 
     @Random2 = MAX(case when rn.seqnum = 2 then rn.n end), 
     @Random3 = MAX(case when rn.seqnum = 3 then rn.n end), 
     @Random4 = MAX(case when rn.seqnum = 4 then rn.n end), 
     @Random5 = MAX(case when rn.seqnum = 5 then rn.n end), 
     @Random6 = MAX(case when rn.seqnum = 6 then rn.n end) 
from randnums rn; 

select @Random1, @Random2, @Random3, @Random4, @Random5, @Random6 

Мой вопрос заключается в том, как случайное это поколение число? и есть ли другой способ сделать это более «случайным».

Я использую:

Microsoft SQL Server 2008 (SP3) - 10.0.5512.0 (X64) Aug 22 2012 19:25:47 Copyright (c) 1988-2008 Microsoft Corporation Developer Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) 

Проблема с большинством решений вы будете в конечном итоге со значениями как это: 14,29,8,14,27,27 Я не могу иметь дублирующие номера!

+1

Как и в вашем [предыдущий вопрос] (http://stackoverflow.com/questions/17413533/insert-lots-of-records-using-sql-server-2008) вы можете использовать 'ORDER BY CRYPT_GEN_RANDOM (8) ', как это документировано, чтобы вернуть« криптографическое случайное число » –

+0

Вы правы, отметили предыдущий ответ, отмеченный галочкой для вашего решения, и проголосовали за вас здесь. Если вы можете объяснить, как код работает в ответе здесь, то отметьте, что вы отметили галочкой :) – PriceCheaperton

+0

На самом деле нет, так как вы все еще пытаетесь найти обманщиков: ' 2,44,1,13,41,44' – PriceCheaperton

ответ

10

Я думаю, вы могли бы сделать что-то вроде этого гораздо проще и гораздо проще

DECLARE @Upper INT; 
DECLARE @Lower INT; 
SET @Lower = 1  -- The lowest random number 
SET @Upper = 49 -- The highest random number 


SELECT @Lower + CONVERT(INT, (@[email protected]+1)*RAND()) 

Чтобы получить случайное число без повторений я думаю, что это будет делать работу

;with CTE 
as 
(
    SELECT randomNumber, COUNT(1) countOfRandomNumber 
    FROM (
    SELECT ABS(CAST(NEWID() AS binary(6)) %49) + 1 randomNumber 
    FROM sysobjects) sample 
    GROUP BY randomNumber 
) 
SELECT TOP 5 randomNumber 
FROM CTE 
ORDER BY newid() 

установить наивысший предел вы может заменить 49 наивысшим лимитом

+0

Ну нет, так как мне нужно убедиться, что один и тот же номер не появляется в случайном порядке 1-6 – PriceCheaperton

+0

Проблема в том, что в итоге вы получите такие значения: '14,29,8,14,27, Я не могу дублировать цифры! – PriceCheaperton

+2

@PriceCheaperton Посмотрите, я обновил свой ответ, надеюсь, что это сработает. –

-1

Вы можете использовать функцию Rand().

select CEILING(RAND() *<max of random numbers)) 
Смежные вопросы