SQL Tips

 

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

色々なサイトからガチャ(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を確認しながら理解しましょう。
このエントリーをはてなブックマークに追加
2016-08-16 17:06:25   481

コメント

[SQL Server] 暗号化、復号化 / ENCRYPTBYPASSPHRASE / DECRYPTBYPASSPHRASE

-.日付:2014-02-28   カテゴリ : -   閲覧数:5698

[SQL Server] 「,」カンマ区切りで結果を返す

-.日付:2018-05-29   カテゴリ : -   閲覧数:96

[SQL Server] SSDT for Visual Studio 2017 offline(オフライン)installer

-.日付:2017-12-26   カテゴリ : -   閲覧数:301

[SQL Server] リンクサーバーのリストを取得する方法 - sp_linkedservers

-.日付:2017-01-16   カテゴリ : -   閲覧数:683

[SQL Server] ガチャ(GACHA)システムを作ろう!

-.日付:2016-08-18   カテゴリ : -   閲覧数:502

Copyright © 2015 INNOYA.COM All rights reserved. RSS