2013-07-02 2 views
2

나는 임의의 6 개의 값을 찾을 수있는 100k 개의 행을 데이터베이스에 반환합니다. 문제는 로또에서 여러 개의 동일한 값을 가질 수 없다는 것입니다. 나는 .. 일부 값은 예를 들어, 동일한을 게재하는 것으로 나타났습니다 랜덤 숫자가 SQL을 사용하여 동일하지 않다는 것을 확인

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 

@Gordon : I없이 중복으로 임의의 숫자를 생각하면

enter image description here

답변

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; 
+0

안녕하세요 @ Gordon Linoff : 매우 좋지만별로 좋지 않습니다. 그것은 동일한 숫자가 여러 번 나오지는 않지만 임의성은 거기에 있지 않은 내 문제를 해결합니다. – PriceCheaperton

+0

@PriceCheaperton. . . 나는 네가 무슨 뜻인지 정말로 모른다. 이 코드를 테스트 할 때마다 매번 매우 다른 조합이 생성됩니다. 무작위성은 newid()에 의한 order by에 의해 보장되어야한다. 다음은 동일한 논리 (http://www.sqlfiddle.com/#!3/d41d8/16696)를 가진 SQLFiddle입니다. 변수를 처리하기 위해 SQLFiddle을 얻는 방법을 찾지 못했기 때문에 모든 변수가 하드 코드되었습니다. –

+0

@ GordonLinoff : 코드를 10,000 번 실행 한 다음 다른 질문에서 다른 숫자가 몇 번 왔는지 보여주는 다른 질문에서 실행 한 쿼리를 실행하면 나는 무슨 뜻인지 알게 될 것입니다. 더 자주 그리고 더 자주 올 수 있습니다. 주파수는 너무 딱 맞지 않습니다. 위의 질문에 업로드 된 스크린 샷을 참조하십시오. 감사합니다. – PriceCheaperton

관련 문제