2

私はデータベースに10万行を返す次のものを持っています。これは6つのランダムな値を見つけるはずです。問題は、複数の同じ値を持つことができないロトにあります。いくつかの値が同じように表示されていることに気付きました..

21-21-34-3-14-46

2121がロト チケットの有効な数字ではないことは明らかです。私の質問は、ランダムな値を生成するときに同じ数字がないことを確認するにはどうすればよいですか?

これが私のコードです:

SET NOCOUNT ON
DECLARE @intFlag INT
SET @intFlag = 1
WHILE (@intFlag <=500000)
BEGIN

--Do Stuff


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
SELECT @Random1 = ROUND(((@Upper - @Lower -1) * RAND() + @Lower), 0)
SELECT @Random2 = ROUND(((@Upper - @Lower -1) * RAND() + @Lower), 0)
SELECT @Random3 = ROUND(((@Upper - @Lower -1) * RAND() + @Lower), 0)
SELECT @Random4 = ROUND(((@Upper - @Lower -1) * RAND() + @Lower), 0)
SELECT @Random5 = ROUND(((@Upper - @Lower -1) * RAND() + @Lower), 0)
SELECT @Random6 = ROUND(((@Upper - @Lower -1) * RAND() + @Lower), 0)
--SELECT @Random;

INSERT INTO CustomerSelections
           ([draw_date]
           ,[val1]
           ,[val2]
           ,[val3]
           ,[val4]
           ,[val5]
           ,[val6])
     VALUES
           (
           '2013-07-05'
           ,@Random1
           ,@Random2
           ,@Random3
           ,@Random4
           ,@Random5
           ,@Random6 
           )


SET @intFlag = @intFlag + 1
END
GO

@ゴードン:

ここに画像の説明を入力

4

1 に答える 1

11

重複のない乱数といえば「順列」だと思います。したがって、アイデアは、可能な値のセットを生成し、それらをランダムに並べ替えてから、最初の 6 つの値をセットとして選択することです。

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;
于 2013-07-02T21:23:40.200 に答える