勉強したことのメモ

webプログラマが勉強したことのメモ。

当選確率が異なる抽選(ガチャ)をPHPで作成

   

ソシャゲのガチャみたいな、当選確率が異なる抽選をPHPで作成したかった。調べたところ以下方法でいけるみたい。

 

ソース

<?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を超えても問題ない。

 

その他

最初は確率分の配列を作って、そこからランダムに引けば良いのかと思った。例のソースの場合だと計100個の値が入った配列を作ってそこから引くというもの。ただこれだとデータ数が多い場合に負荷がかかるみたい。

 - PHP

  関連記事

複数の方法で301リダイレクト

サイトのディレクトリやファイル名を大幅に変えるという案件があった。それ自体は問題 ...

ファイルの更新日付取得とリネーム

やりたかった事は、画像ファイルの更新日時取得と リネーム。 ■参考サイト htt ...

javascriptでHTML内に関数を書きたい場合

ダイアログ確認したいだけでわざわざfunctionを 書くのもアレだという時に使 ...

PHPとSQLiteで簡易BBSの作成

PHPとSQLiteの練習で簡易掲示板を作ったのでメモ。   &nbs ...

PHPでcharset

header("Content-Type: text/html; charset ...

ページング処理用PHP

/* @内容 ページング処理のfunction @使い方 //******親ペー ...

composerでmonologとTwigをインストール

「composerで○○をインストール」というのをよく見かけるがcomposer ...

Codeigniterで異なるデータベースを使用する

Codeigniterで2つのコンテンツがあって、それぞれ別のデータベースを使用 ...

no image
PHPでもキャッシュで画像が表示されない

ここみたいにキャッシュの影響と考えられるケースが発生した。 結果的にキャッシュっ ...

PHPとStripeで定額課金(サブスクリプション)実装

PHPとStripeで1ヶ月ごとに500円でサイト内のサービスを使い放題のような ...