zoukankan      html  css  js  c++  java
  • PHP游戏中的抽奖算法初探

    本示例代码是一段经典的概率算法,$probability是一个预先设置的数组,假设数组为:array(10,20,30,40),
    开始是从1,100这个概率范围内筛选第一个数是否在他的出现概率范围之内,
    如果不在,则将概率空间,也就是k的值减去刚刚的那个数字的概率空间,在本例当中就是减去100,
    也就是说第二个数是在1,900这个范围内筛选的。这样筛选到最终,总会有一个数满足要求。
    就相当于去一个箱子里摸东西,第一个不是,第二个不是,第三个还不是,那最后一个一定是。
    这个算法简单,而且效率非常高,关键是这个算法已在我们以前的项目中有应用,尤其是大数据量的项目中效率非常棒。
    PHP+jQuery实现翻板抽奖Demo

    <?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];

    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);

  • 相关阅读:
    OO系统分析员之路用例分析系列(3)业务建模之涉众
    Case study—Courseware Management System
    Creating the Use Case Diagram
    ODBC
    Class Diagram
    OO系统分析员之路用例分析系列(2)用例的类型与粒度
    Cache Object Script语言(转载)
    无法在web服务器上启动调试.
    Abbreviation
    发布订阅原理
  • 原文地址:https://www.cnblogs.com/Jerry-blog/p/5010266.html
Copyright © 2011-2022 走看看