<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[BIWEB开源PHP WMS系统创始人ArthurXF肖飞的blog]]></title> 
<link>http://www.bizeway.net/index.php</link> 
<description><![CDATA[网务通 - 网务公司发展之路]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[BIWEB开源PHP WMS系统创始人ArthurXF肖飞的blog]]></copyright>
<item>
<link>http://www.bizeway.net/read.php?</link>
<title><![CDATA[PHP概率算法（适用于抽奖、随机广告）]]></title> 
<author>ArthurXF &lt;arthurxf@gmail.com&gt;</author>
<category><![CDATA[PHP]]></category>
<pubDate>Fri, 26 Oct 2012 03:33:45 +0000</pubDate> 
<guid>http://www.bizeway.net/read.php?</guid> 
<description>
<![CDATA[ 
	<span style="color: #424242; line-height: 24px; text-indent: 28px; font-family: &quot;Microsoft YaHei&quot;, Tahoma, Helvetica, Arial, sans-serif">概率计算函数</span> <div><pre class="prettyprint"><p><span class="kwd">function</span><span class="pln"> get_rand</span><span class="pun">(</span><span class="pln">$proArr</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{ </span></p><p><span class="pun"> </span><span class="pln"> &nbsp; $result </span><span class="pun">=</span><span class="pln"> </span><span class="str">''</span><span class="pun">; </span></p><p><span class="pun"> </span><span class="pln"> &nbsp; </span><span class="com">//概率数组的总概率精度 </span></p><p><span class="com"> &nbsp; &nbsp;$proSum = array_sum($proArr); </span></p><p><span class="com"> &nbsp; &nbsp;//概率数组循环 </span></p><p><span class="com"> &nbsp; &nbsp;foreach ($proArr as $key =&gt; $proCur) { </span></p><p><span class="com"> &nbsp; &nbsp; &nbsp; &nbsp;$randNum = mt_rand(1, $proSum); </span></p><p><span class="com"> &nbsp; &nbsp; &nbsp; &nbsp;if ($randNum </span><span><span class="com">&lt;</span></span><span class="com">= $proCur) { </span></p><p><span class="com"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$result = $key; </span></p><p><span class="com"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break; </span></p><p><span class="com"> &nbsp; &nbsp; &nbsp; &nbsp;} else { </span></p><p><span class="com"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$proSum -= $proCur; </span></p><p><span class="com"> &nbsp; &nbsp; &nbsp; &nbsp;} </span></p><p><span class="com"> &nbsp; &nbsp;} </span></p><p><span class="com"> &nbsp; &nbsp;unset ($proArr); </span></p><p><span class="com"> &nbsp; &nbsp;return $result; </span></p><p><span class="com">} </span></p><br /><br /></pre><span style="color: #424242; line-height: 24px; text-indent: 28px; font-family: &quot;Microsoft YaHei&quot;, Tahoma, Helvetica, Arial, sans-serif">上述代码是一段经典的概率算法，$proArr是一个预先设置的数组，假设数组为：array(100,200,300，400)，开始是从1,1000这个概率范围内筛选第一个数是否在他的出现概率范围之内， &nbsp;如果不在，则将概率空间，也就是k的值减去刚刚的那个数字的概率空间，在本例当中就是减去100，也就是说第二个数是在1，900这个范围内筛选的。这样筛选到最终，总会有一个数满足要求。就相当于去一个箱子里摸东西，第一个不是，第二个不是，第三个还不是，那最后一个一定是。这个算法简单，而且效率非常高，关键是这个算法已在我们以前的项目中有应用，尤其是大数据量的项目中效率非常棒。</span></div> <div><span style="color: #424242; line-height: 24px; text-indent: 28px; font-family: &quot;Microsoft YaHei&quot;, Tahoma, Helvetica, Arial, sans-serif"><br /></span></div> <div><span style="color: #424242; line-height: 24px; text-indent: 28px; font-family: &quot;Microsoft YaHei&quot;, Tahoma, Helvetica, Arial, sans-serif">接下来我们通过PHP配置奖项</span></div> <div><pre class="prettyprint"><p><span class="pln">$prize_arr </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">( </span></p><p><span class="pun"> </span><span class="pln"> &nbsp; </span><span class="str">'0'</span><span class="pln"> </span><span class="pun">=</span><span><span class="pun">&gt;</span></span><span class="pln"> array</span><span class="pun">(</span><span class="str">'id'</span><span class="pun">=&gt;</span><span class="lit">1</span><span class="pun">,</span><span class="str">'prize'</span><span class="pun">=&gt;</span><span class="str">'平板电脑'</span><span class="pun">,</span><span class="str">'v'</span><span class="pun">=&gt;</span><span class="lit">1</span><span class="pun">), </span></p><p><span class="pun"> </span><span class="pln"> &nbsp; </span><span class="str">'1'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> array</span><span class="pun">(</span><span class="str">'id'</span><span class="pun">=&gt;</span><span class="lit">2</span><span class="pun">,</span><span class="str">'prize'</span><span class="pun">=&gt;</span><span class="str">'数码相机'</span><span class="pun">,</span><span class="str">'v'</span><span class="pun">=&gt;</span><span class="lit">5</span><span class="pun">), </span></p><p><span class="pun"> </span><span class="pln"> &nbsp; </span><span class="str">'2'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> array</span><span class="pun">(</span><span class="str">'id'</span><span class="pun">=&gt;</span><span class="lit">3</span><span class="pun">,</span><span class="str">'prize'</span><span class="pun">=&gt;</span><span class="str">'音箱设备'</span><span class="pun">,</span><span class="str">'v'</span><span class="pun">=&gt;</span><span class="lit">10</span><span class="pun">), </span></p><p><span class="pun"> </span><span class="pln"> &nbsp; </span><span class="str">'3'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> array</span><span class="pun">(</span><span class="str">'id'</span><span class="pun">=&gt;</span><span class="lit">4</span><span class="pun">,</span><span class="str">'prize'</span><span class="pun">=&gt;</span><span class="str">'4G优盘'</span><span class="pun">,</span><span class="str">'v'</span><span class="pun">=&gt;</span><span class="lit">12</span><span class="pun">), </span></p><p><span class="pun"> </span><span class="pln"> &nbsp; </span><span class="str">'4'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> array</span><span class="pun">(</span><span class="str">'id'</span><span class="pun">=&gt;</span><span class="lit">5</span><span class="pun">,</span><span class="str">'prize'</span><span class="pun">=&gt;</span><span class="str">'10Q币'</span><span class="pun">,</span><span class="str">'v'</span><span class="pun">=&gt;</span><span class="lit">22</span><span class="pun">), </span></p><p><span class="pun"> </span><span class="pln"> &nbsp; </span><span class="str">'5'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> array</span><span class="pun">(</span><span class="str">'id'</span><span class="pun">=&gt;</span><span class="lit">6</span><span class="pun">,</span><span class="str">'prize'</span><span class="pun">=&gt;</span><span class="str">'下次没准就能中哦'</span><span class="pun">,</span><span class="str">'v'</span><span class="pun">=&gt;</span><span class="lit">50</span><span class="pun">), </span></p><p><span class="pun">); </span></p><br /><br /></pre><span style="color: #424242; line-height: 24px; text-indent: 28px; font-family: &quot;Microsoft YaHei&quot;, Tahoma, Helvetica, Arial, sans-serif">上例中是一个二维数组，记录了所有本次抽奖的奖项信息，其中id表示中奖等级，prize表示奖品，v表示中奖概率。注意其中的v必须为整数，你可以将对应的奖项的v设置成0，即意味着该奖项抽中的几率是0，数组中v的总和（基数），基数越大越能体现概率的准确性。本例中v的总和为100，那么平板电脑对应的中奖概率就是1%，如果v的总和是10000，那中奖概率就是万分之一了</span></div> <div><span style="color: #424242; line-height: 24px; text-indent: 28px; font-family: &quot;Microsoft YaHei&quot;, Tahoma, Helvetica, Arial, sans-serif"><br /></span></div> <div><span style="color: #424242; line-height: 24px; text-indent: 28px; font-family: &quot;Microsoft YaHei&quot;, Tahoma, Helvetica, Arial, sans-serif">PHP循环奖项设置数组，通过概率计算函数get_rand获取抽中的奖项id。将中奖奖品保存在数组$res['yes']中，而剩下的未中奖的信息保存在$res['no']中，最后输出json个数数据给前端页面。</span></div> <div><pre class="prettyprint"><p><span class="kwd">foreach</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$prize_arr </span><span class="kwd">as</span><span class="pln"> $key </span><span class="pun">=&gt;</span><span class="pln"> $val</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{ </span></p><p><span class="pun"> </span><span class="pln"> &nbsp; $arr</span><span class="pun">[</span><span class="pln">$val</span><span class="pun">[</span><span class="str">'id'</span><span class="pun">]]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> $val</span><span class="pun">[</span><span class="str">'v'</span><span class="pun">]; </span></p><p><span class="pun">} </span></p><p><span class="pln">$rid </span><span class="pun">=</span><span class="pln"> get_rand</span><span class="pun">(</span><span class="pln">$arr</span><span class="pun">);</span><span class="pln"> </span><span class="com">//根据概率获取奖项id </span></p><p><span class="com">$res['yes'] = $prize_arr[$rid-1]['prize']; //中奖项 </span></p><br /><p><span class="pln">unset</span><span class="pun">(</span><span class="pln">$prize_arr</span><span class="pun">[</span><span class="pln">$rid</span><span class="pun">-</span><span class="lit">1</span><span class="pun">]);</span><span class="pln"> </span><span class="com">//将中奖项从数组中剔除，剩下未中奖项 </span></p><p><span class="com">shuffle($prize_arr); //打乱数组顺序 </span></p><br /><p><span class="kwd">for</span><span class="pun">(</span><span class="pln">$i</span><span class="pun">=</span><span class="lit">0</span><span class="pun">;</span><span class="pln">$i</span><span><span class="pun">&lt;</span></span><span><span class="pln">count</span></span><span class="pun">(</span><span class="pln">$</span><span><span class="pln">prize_arr</span></span><span class="pun">);</span><span class="pln">$</span><span><span class="pln">i</span></span><span class="pun">++){ </span></p><p><span class="pun"> </span><span class="pln"> &nbsp; $</span><span><span class="pln">pr</span></span><span class="pun">[]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span><span class="pln">$prize_arr</span><span class="pun">[</span><span class="pln">$i</span><span class="pun">][</span></span><span class="str">'</span><span><span class="str">prize</span></span><span class="str">'</span><span class="pun">]; </span></p><p><span class="pun">} </span></p><br /><p><span class="pln">$</span><span><span class="pln">res</span></span><span class="pun">[</span><span class="str">'</span><span><span class="str">no</span></span><span class="str">'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span><span class="pln">$pr</span><span class="pun">;</span></span><span class="pun"> </span><span class="pln"> &nbsp;</span><span class="com">// 除了中奖外的其他数据</span></p><br /><p><span class="pln">echo</span><span><span class="pln"> </span></span><span class="pln">json_encode</span><span><span class="pun">(</span><span class="pln">$</span></span><span class="pln">res</span><span><span class="pun">);</span></span></p><br /><br /></pre><br /></div><br/>Tags - <a href="tag.php?tag=php" rel="tag">php</a>
]]>
</description>
</item><item>
<link>http://www.bizeway.net/read.php?&amp;guid=0#topreply</link>
<title><![CDATA[[评论] PHP概率算法（适用于抽奖、随机广告）]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.bizeway.net/read.php?&amp;guid=0#topreply</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>