안녕하세요.
확률에 관련된 프로그래밍을 하다가 혹시 이런 기능이 쿼리로도 가능한지 궁금해서 질문 올립니다.
아이템 이름 드랍확률
칼1 30
칼2 20
칼3 15
칼4 15
칼5 10
칼6 5
칼7 3
칼8 2
이런 테이블이 있을때 드랍확률과 연동하여 랜덤하게 아이템이 나오도록 쿼리를 만들수 있는지요?
고수님들의 도움 부탁드립니다.
감사합니다.
Comment 5
-
제온
2013.05.08 11:32
답변 감사드립니다.
추가로 질문 드릴 사항이 있습니다.
실제로 쿼리를 실행시켜 보니 확률값에 유사하게 결과값이 나온다기 보다는 그냥 랜덤으로 나오는 경향이 있는것 같은데요.
DECLARE @Prob INT
SELECT @Prob = convert(int, rand()*1000)
SELECT TOP 1 * FROM #아이템 WHERE 확률 <= @Prob ORDER BY 이름 DESC이런 방식은 문제가 있을까요?
-
만약 확률값고 유사 또는 일치하게 나오게 하려면 전체 추출하려는 숫자중에 확률의 비중만큼씩 뽑아야겠죠.
저는 확률이라고 하셨고 랜덤이라고 하셨기 때문에 저렇게 쿼리를 만든건데요.
예를 들어서 검은공을 10개 흰공을 20개 주머니에 넣고 하나씩 뽑는다고 치면
아무래도 흰공이 검은공보다는 두배 더 나올거라고 기대할 수 있겠죠?
하지만 정확히 흰공이 두배 나오진 않을거구요.
-
진윤호
2013.05.08 12:23
CREATE TABLE #Item (IDX INT IDENTITY(1,1), Name VARCHAR(10), PER INT)
INSERT INTO #Item
SELECT '칼', 30 UNION ALL
SELECT '칼', 20 UNION ALL
SELECT '칼', 15 UNION ALL
SELECT '칼', 15 UNION ALL
SELECT '칼', 10 UNION ALL
SELECT '칼', 5 UNION ALL
SELECT '칼', 3 UNION ALL
SELECT '칼', 2
DECLARE @SUM INT
DECLARE @CNT TINYINT
DECLARE @NAME VARCHAR(10)
DECLARE @PER INT
DECLARE @RAND INT
DECLARE @LOOP TINYINT
SELECT @SUM=SUM(PER),@CNT=COUNT(1) FROM #Item
SET @RAND = ROUND(RAND() * (@SUM - 1), 0) + 1
SET @LOOP = 0
WHILE @LOOP != @CNT
BEGIN
SELECT @Name = Name, @PER = Per FROM #Item WHERE IDX = @LOOP + 1
IF @RAND <= @PER
BEGIN
SET @LOOP = @CNT
END
ELSE
BEGIN
SET @RAND = @RAND - @PER
SET @LOOP = @LOOP + 1
END
END
SELECT @Name,@per
-
진윤호
2013.05.08 14:03
IDX 컬럼 없이 작업하셔야 한다면 PER DESC 정렬하셔서 ROW_NUMBER()로 컬럼을 만드는 임시 테이블을 사용 하셔서 하셔도 같은 방식으로 돌아갑니다.
제가 로또번호 뽑을때 쓰는 방법이네요 ㅎㅎ
IF EXISTS (SELECT 1 FROM tempdb.sys.objects WHERE object_id = OBJECT_ID('tempdb.dbo.#확율')) DROP TABLE #확율
IF EXISTS (SELECT 1 FROM tempdb.sys.objects WHERE object_id = OBJECT_ID('tempdb.dbo.#아이템')) DROP TABLE #아이템
CREATE TABLE #확율 (확율 INT)
DECLARE @A INT = 1
WHILE @A <= 100 BEGIN
INSERT INTO #확율 SELECT @A
SET @A = @A + 1
END
CREATE TABLE #아이템 (이름 VARCHAR(10), 확율 INT)
INSERT INTO #아이템
SELECT '칼1', 30 UNION ALL
SELECT '칼2', 20 UNION ALL
SELECT '칼3', 15 UNION ALL
SELECT '칼4', 15 UNION ALL
SELECT '칼5', 10 UNION ALL
SELECT '칼6', 5 UNION ALL
SELECT '칼7', 3 UNION ALL
SELECT '칼8', 2
DECLARE @추출 INT
SET @추출 = 10
SELECT TOP(@추출) A.*
FROM #아이템 A INNER JOIN #확율 B ON A.확율 >= B.확율
ORDER BY NEWID()