[SQL Server] ガチャ(Gacha(くじ))システムを作ろう。確率によってアイテム(ITEM)が当たるSQL

inno
2016-08-16 17:06 1151 0
色々なサイトからガチャ(Gacha(くじ))イベント(キャンペーン)がしていますが、
そのようなシステムを作る方法を説明したいと思います。

まず、アイテム情報と当たる確率を設定するテーブルを作成しましょう。
そしてデータも登録しましょう。

CREATE TABLE dbo.tGachaItem
(
ItemID varchar(50)
,ItemRate float
)

INSERT INTO dbo.tGachaItem (ItemID, ItemRate) VALUES ('はずれ', 50)
INSERT INTO dbo.tGachaItem (ItemID, ItemRate) VALUES ('3等 : アイテム', 30)
INSERT INTO dbo.tGachaItem (ItemID, ItemRate) VALUES ('1等 : アイテム', 1)
INSERT INTO dbo.tGachaItem (ItemID, ItemRate) VALUES ('2等 : アイテム', 20)

上記のようにアイテムと確率を設定しました。
確率合計が100ではなくても問題ありません。

次のSQLを一括で実行してみてください。

DECLARE @RateSum float
SELECT @RateSum = SUM(ItemRate) FROM dbo.tGachaItem WITH (NOLOCK)

DECLARE @Rand float
SELECT @Rand = CONVERT(float,RAND() * @RateSum)

CREATE TABLE #ItemRate 
(
Idx int identity(1,1)
,ItemID varchar(50)
,ItemRate float
)

INSERT INTO #ItemRate
SELECT ItemID, ItemRate
FROM dbo.tGachaItem WITH (NOLOCK)
ORDER BY ItemRate, ItemID

DECLARE @ItemID varchar(50)

SELECT TOP 1 @ItemID = A.ItemID
FROM #ItemRate A WITH (NOLOCK)
INNER JOIN #ItemRate B WITH (NOLOCK) 
ON A.Idx >= B.Idx
GROUP BY A.ItemID,A.ItemRate
HAVING SUM(B.ItemRate) >= @Rand 
ORDER BY A.ItemRate

SELECT @ItemID AS [当たりアイテム]

DROP TABLE #ItemRate

設定した確率のとおりアイテムが当たると思います。
使い方の説明でしたので、どのように動くのかについては一つ一つSQLを確認しながら理解しましょう。

コメント