PHP遊戲中的抽獎算法初探

本示例代碼是一段經典的機率算法,$probability是一個預先設置的數組,假設數組爲:array(10,20,30,40),
開始是從1,100這個機率範圍內篩選第一個數是否在他的出現機率範圍以內,
若是不在,則將機率空間,也就是k的值減去剛剛的那個數字的機率空間,在本例當中就是減去100,
也就是說第二個數是在1,900這個範圍內篩選的。這樣篩選到最終,總會有一個數知足要求。
就至關於去一個箱子裏摸東西,第一個不是,第二個不是,第三個還不是,那最後一個必定是。
這個算法簡單,並且效率很是高,關鍵是這個算法已在咱們之前的項目中有應用,尤爲是大數據量的項目中效率很是棒。
PHP+jQuery實現翻板抽獎Demophp

<?php
/**
 * 機率算法
 * @param array $probability
 * @return integer|string
 */
function get_rand($probability)
{
	// 機率數組的總機率精度
	$max = array_sum($probability);
 
	foreach ($probability as $key => $val)
	{
		$rand_number = mt_rand(1, $max);
 
		if ($rand_number <= $val)
		{
			return $key;
		}
		else
		{
			$max -= $val;
		}
	}
}
// 機率比例
/* 接下來咱們經過PHP配置獎項。 */
$data = array(
		array(
			"平板電腦","prob"=>1
		),
		array(
			"數碼相機","prob"=>3
		),
		array(
			"音箱設備","prob"=>6
		),
		array(
			"8G優盤","prob"=>20
		),
		array(
			"10Q幣","prob"=>25
		),
		array(
			"prize"=>"下次沒準就能中噢","prob"=>50
		)
);

$data中是一個二維數組,記錄了全部本次抽獎的獎項信息,其中prize表示獎品,prob表示中獎機率。注意其中的prob必須爲整數
你能夠將對應的獎項的prob設置成0,即意味着該獎項抽中的概率是0
數組中prob的總和(基數),基數越大越能體現機率的準確性。
本例中prob的總和爲100,那麼平板電腦對應的中獎機率就是1%,若是prob的總和是1000,那中獎機率就是千分之一了。算法

<?php

foreach ($data as $key=>$val)
{
$probability[$key] = $val["prob"];
}
$n = get_rand($probability);
$res['yes'] =$data[$n][0];json

unset($data[$n]); // 將中獎項從數組中剔除,剩下未中獎項
shuffle($data); // 將獎項順序打亂
$func = create_function(‘$x’,'return $x[0];’);數組

//$res['no'] = array_map(function($x){return $x[0];}, $data); // 除了中獎外的其餘數據
$res['no'] = array_map($func, $data); // 除了中獎外的其餘數據大數據

echo json_encode($res);code

相關文章
相關標籤/搜索