ソシャゲのガチャのように当選確率が異なる抽選システムをPHPで作成する方法
2024/01/28
ソシャゲのガチャみたいな当選確率が異なる抽選システムをPHPで作成したかった。具体的にはレア度が1~6まであり、レア度が低いものは当たりやすくレア度が高いものは当たりにくいというもの。また、レア度それぞれの当たりやすさ(当選確率)も制御したい。以下に実装方法をメモ。
ソース
<?php //ガチャ用データ $data = array( 0 => array('name' => '星1', 'rate' => 30), 1 => array('name' => '星2', 'rate' => 25), 2 => array('name' => '星3', 'rate' => 20), 3 => array('name' => '星4', 'rate' => 15), 4 => array('name' => '星5', 'rate' => 9), 5 => array('name' => '星6', 'rate' => 1), ); echo $data[gacha($data)]['name']; //当たった配列のnameを出力 function gacha( $data = array() ){ //確率の合計値 $max = 0; foreach( $data as $record ) $max += $record['rate']; //当たりの決定 $hit = mt_rand( 0, ($max - 1) ); //当たった乱数がどの部分になるのか調べてヒットしたら返す foreach( $data as $key => $record ){ $max -= $record['rate']; if( $max <= $hit ) return $key; } } ?>
当選確率について
rateが確率の部分。整数値でも小数値でも良い。合計を100にするとパーセンテージとして分かりやすい。100を超えても問題ない。
実運用について
実運用としては予めMySQLにレア度1~6のガチャ商品(アイテムやキャラクタ等)のデータをレア度と共に保存しておき上記のガチャで抽選後、以下のようなSQL文で取り出す形になりそう。
//指定したレア度のデータをランダムで1件取得 SELECT * FROM `gacha` WHERE `rate` = 'レア度' ORDER BY RAND() LIMIT 1;
その他
最初は確率分の配列を作って、そこからランダムに引けば良いのかと思った。例のソースの場合だと計100個の値が入った配列を作ってそこから引くというもの。ただこれだとデータ数が多い場合に負荷がかかるみたい。
関連記事
-
PHPでmysqli関数使用時のプリペアドステートメントの利用方法
PHPでMySQLを扱う際はmysqli関数を、エスケープの際はreal_esc ...
-
Shift_JISでカタカナのソを出力するとエラー
先に結論として5C問題とかいうみたいで仕様らしい。 ■参考サイト http:// ...
-
PHPで画像を分割し並べ替えて出力したものをJavaScriptで復元する方法
ある電子書籍サイトをブラウザの開発者ツールで見てみたところ、PHPでページ画像を ...
-
AjaxのJSONP使用でPHPで作った配列をJSに返す方法
AというサイトからBというサイトにAjax通信し、Bの方ではMySQLに接続して ...
-
PHPで作成したプログラムをcron設定し自動実行する方法
cronの設定方法。サーバー側での設定とPHP側での書き方を以下にメモ。 &nb ...