前段時間被問這個問題,最近有空就寫寫啦,還是挺有趣的
首先做下搶紅包方法分類:
對於發紅包的人來說,一共有大致3類(其他的我暫時沒想到,有想到可以聯系我呀~)
一、拼手氣紅包個數不定(完全看運氣)
二、拼手氣紅包規定個數(個數一定,至少一分)
三、平均分紅包(個數一定,大家平分)還是這個好寫是吧!嘿嘿
上代碼:
<?php var_dump(rob_red_bages(5 , 10)); var_dump(distribute_red_bages(5)); /* 方法主要功能:拼手氣紅包(個數不定) 一個參數 參數一: 紅包總金額(按分計算) */ function distribute_red_bages($sum){ $sum = $sum*100; $i=0; while($sum>0){ $temp = rand(1 , $sum);//紅包值 $sum -= $temp; $arr[$i++] = $temp/100; } //check($arr); return $arr; } /* 方法主要功能:均分紅包 兩個參數: 參數一: 紅包總金額 參數二: 均分個數 */ function average_red_bages($sum , $num){ $res = $sum/$num; for($i=0 ; $i<$num ; $i++){ $arr[$i] = $res; } //check($arr); return $arr; } /* 方法主要功能:規定個數的手氣紅包 兩個參數: 參數一:紅包總金額 參數二:紅包個數 計算流程,隨機生成num個數 求和得到m 用sum/m 得到每個數需要k 用隨機數*k */ function rob_red_bages($sum , $num){ $sum = $sum*100; for($i=0 ; $i<$num ; $i++){ $temp = rand(1 , $sum); $arr[$i] = $temp; $sumall += $temp; } $k = $sum/$sumall; for($i=0 ; $i<sizeof($arr); $i++){ $arr2[$i] = $arr[$i]*$k/100; } return $arr2; } /*紅包總額檢測*/ function check($arr){ foreach($arr as $a){ $sum += $a; echo $a."+"; } echo " 0 =".$sum."\n"; } ?>
下面分析下拼手氣紅包吧(平分的就不說了,大家都會):
拼手氣紅包個數不定思路:(總金額:sum)
---->隨機第一個小於sum的數: n
---->總金額減去該數: temp = sum-n
---->隨機一個小於temp的數
---->遞歸上述方法直到總金額為0
---->返回存儲隨機結果的數組
這個方法比較常規,用來實現規定個數的紅包也是可以實現的!不過~
拼手氣紅包規定個數思路(總金額 sum,紅包個數 num )
---->隨機num個小於sum的數,生成數組
---->對這些數求和得到allsum
---->用sum除以allsum得到所有生成數的公倍數
---->數組每個元素與公倍數相乘得到每個紅包的的數值
這個方法有缺點(最終的結果可能會略大於sum,或者略小於sum 因為除法可能出現無理數)
大概就是這些啦!歡迎交流指正!~~~