麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 開發 > PHP > 正文

PHP概率計算函數匯總

2024-05-04 23:39:01
字體:
來源:轉載
供稿:網友

做項目的有時會弄個活動什么的,來讓用戶參加,既吸引用戶注冊,又提高網站的用戶活躍度。同時參加的用戶會獲得一定的獎品,有100%中獎的,也有按一定概率中獎的,大的比如中個ipad,小的中個Q幣。那么我們在程序里必然會設計到算法,即按照一定的概率讓用戶獲得獎品。

其實發這篇博感覺并沒有什么用,太簡單了,會的人不屑看,不會的人自已動動腦子也想到了。但是看著自已的博客已經這么久沒更,真心疼~。粗略算下一篇只有代碼的水文,會占用OSC至少十幾KB的數據庫空間呢,但是,一想到亂彈里的然并卵,也就釋然了。

 

 
  1. <?php 
  2.  
  3. /** 
  4. * 概率計算類 
  5. * 可用于抽獎等 
  6. */ 
  7. class Probability 
  8. /** 
  9. * 概率統計數據 
  10. * thing => chance 
  11. */ 
  12. var $data = array(); 
  13. var $chance_count = 0; 
  14.  
  15. function __construct($initdata = array()){ 
  16. if(!empty($initdata)){ 
  17. $this->data = $initdata; 
  18. foreach($initdata as $d){ 
  19. $this->chance_count += $d['num']; 
  20.  
  21. function addData($name, $chance){ 
  22. $this->data[]=array('name'=>$name, 'num'=>$chance); 
  23. $this->chance_count += $chance; 
  24.  
  25. function getOne(){ 
  26. $index = rand(0, $this->chance_count); 
  27. foreach($this->data as $d){ 
  28. $index = $index-$d['num']; 
  29. if($index<=0){ 
  30. return $d['name']; 
  31. return ''
  32.  
  33.  
  34. /** 
  35. * 使用示例 
  36. */ 
  37. $pro=new Probability(); 
  38. $pro->addData('iphone',10); 
  39. $pro->addData('watch',30); 
  40. $pro->addData('$18',50); 
  41. $pro->addData('thank you',10); 
  42. $pro->addData('super big',1); 
  43. for($i=0;$i<100;$i++){ 
  44. echo $pro->getOne()."/n"

這是一個很經典的概率算法函數:

 

 
  1. function get_rand($proArr) {  
  2. $result = '';  
  3. //概率數組的總概率精度  
  4. $proSum = array_sum($proArr);  
  5. //概率數組循環  
  6. foreach ($proArr as $key => $proCur) {  
  7. $randNum = mt_rand(1, $proSum); //抽取隨機數 
  8. if ($randNum <= $proCur) {  
  9. $result = $key; //得出結果 
  10. break;  
  11. else {  
  12. $proSum -= $proCur;  
  13. }  
  14. }  
  15. unset ($proArr);  
  16. return $result;  

假設:我們有這樣一個數組:a獎概率20%,b獎概率30%,c獎概率50%

 

 
  1. $prize_arr =array('a'=>20,'b'=>30,'c'=>50); 

模擬函數執行過程:

總概率精度為20+30+50=100

第一次數組循環,$procur=20

假設抽取的隨機數rand(1,100),假設抽到$randNum=55

if判斷-------

如果$randNum<=20,則result=a

否則進入下一循環,總概率精度變為100-20=80

第二次數組循環,$procur=30

假設抽取的隨機數rand(1,80),假設抽到$randNum=33

if判斷---------

如果$randNum<=30,則result=b

否則進入下一循環,總概率精度變為80-30=50

第三次數組循環,$prosur=50;

假設抽取的隨機數rand(1,50),不管怎么抽,隨機數都會<或=50,

那么得出result=c;

因為樣本沒有改變,雖然可能抽取的隨機數不止一個,但是概率是不變的。

或者也可以這樣:

 

 
  1. function get_rand($arr) 
  2. $pro_sum=array_sum($arr); 
  3. $rand_num=mt_rand(1,$pro_sum); 
  4. $tmp_num=0; 
  5. foreach($arr as $k=>$val) 
  6. {  
  7. if($rand_num<=$val+$tmp_num) 
  8. $n=$k; 
  9. break
  10. }else 
  11. $tmp_num+=$val; 
  12. return $n; 

在給大家分享一個抽獎的概率算法

 

 
  1. /* 
  2. * 經典的概率算法, 
  3. * $proArr是一個預先設置的數組, 
  4. * 假設數組為:array(100,200,300,400), 
  5. * 開始是從1,1000 這個概率范圍內篩選第一個數是否在他的出現概率范圍之內,  
  6. * 如果不在,則將概率空間,也就是k的值減去剛剛的那個數字的概率空間, 
  7. * 在本例當中就是減去100,也就是說第二個數是在1,900這個范圍內篩選的。 
  8. * 這樣 篩選到最終,總會有一個數滿足要求。 
  9. * 就相當于去一個箱子里摸東西, 
  10. * 第一個不是,第二個不是,第三個還不是,那最后一個一定是。 
  11. * 這個算法簡單,而且效率非常 高, 
  12. * 關鍵是這個算法已在我們以前的項目中有應用,尤其是大數據量的項目中效率非常棒。 
  13. */ 
  14. function get_rand($proArr) { 
  15. $result = ''
  16. //概率數組的總概率精度  
  17. $proSum = array_sum($proArr); 
  18. //概率數組循環  
  19. foreach ($proArr as $key => $proCur) { 
  20. $randNum = mt_rand(1, $proSum); 
  21. if ($randNum <= $proCur) { 
  22. $result = $key; 
  23. break
  24. else { 
  25. $proSum -= $proCur; 
  26. unset ($proArr); 
  27. return $result; 
  28.  
  29.  
  30. /* 
  31. * 獎項數組 
  32. * 是一個二維數組,記錄了所有本次抽獎的獎項信息, 
  33. * 其中id表示中獎等級,prize表示獎品,v表示中獎概率。 
  34. * 注意其中的v必須為整數,你可以將對應的 獎項的v設置成0,即意味著該獎項抽中的幾率是0, 
  35. * 數組中v的總和(基數),基數越大越能體現概率的準確性。 
  36. * 本例中v的總和為100,那么平板電腦對應的 中獎概率就是1%, 
  37. * 如果v的總和是10000,那中獎概率就是萬分之一了。 
  38.  
  39. */ 
  40. $prize_arr = array( 
  41. '0' => array('id'=>1,'prize'=>'平板電腦','v'=>1), 
  42. '1' => array('id'=>2,'prize'=>'數碼相機','v'=>5), 
  43. '2' => array('id'=>3,'prize'=>'音箱設備','v'=>10), 
  44. '3' => array('id'=>4,'prize'=>'4G優盤','v'=>12), 
  45. '4' => array('id'=>5,'prize'=>'10Q幣','v'=>22), 
  46. '5' => array('id'=>6,'prize'=>'下次沒準就能中哦','v'=>50), 
  47. ); 
  48.  
  49. /* 
  50. * 每次前端頁面的請求,PHP循環獎項設置數組, 
  51. * 通過概率計算函數get_rand獲取抽中的獎項id。 
  52. * 將中獎獎品保存在數組$res['yes']中, 
  53. * 而剩下的未中獎的信息保存在$res['no']中, 
  54. * 最后輸出json個數數據給前端頁面。 
  55. */ 
  56. foreach ($prize_arr as $key => $val) { 
  57. $arr[$val['id']] = $val['v']; 
  58. $rid = get_rand($arr); //根據概率獲取獎項id  
  59.  
  60. $res['yes'] = $prize_arr[$rid-1]['prize']; //中獎項  
  61. unset($prize_arr[$rid-1]); //將中獎項從數組中剔除,剩下未中獎項  
  62. shuffle($prize_arr); //打亂數組順序  
  63. for($i=0;$i<count($prize_arr);$i++){ 
  64. $pr[] = $prize_arr[$i]['prize']; 
  65. $res['no'] = $pr; 
  66. print_r($res['yes']); 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: wwwxxx免费视频 | 72pao成人国产永久免费视频 | 91精品成人福利在线播放 | 国产成人精品区一区二区不卡 | 国产成人综合在线观看 | omofun 动漫在线观看 | 久久免费视频一区二区三区 | 粉嫩蜜桃麻豆免费大片 | 成人激情视频网站 | 在线亚洲免费 | 黄色特级片黄色特级片 | 亚洲一区中文字幕 | 国产成人高潮免费观看精品 | 久久精品综合视频 | 精品一区二区免费 | 综合国产在线 | 欧美日在线观看 | 日韩毛片一区二区三区 | 欧美视屏一区二区 | 亚洲欧美aⅴ | 日韩精品中文字幕在线观看 | 精品一区二区三区不卡 | 欧美视频国产精品 | 国产福利视频 | 亚洲最新黄色网址 | 国产精品久久久久久久av | 国产v综合v亚洲欧美久久 | 日韩大片在线永久观看视频网站免费 | 一分钟免费观看完整版电影 | 国产一区二精品区在线 | 国产精品久久久久久久久久 | 国产一区精品在线观看 | 69性欧美高清影院 | 国产精品自拍99 | 一级在线视频 | 黄色网址免费在线 | 国产成人精品免高潮在线观看 | 嫩草影院在线观看网站成人 | 九九热久久免费视频 | chinesehdxxxx无套 久久另类视频 | 黄色免费影片 |