<?php
/*
砍价小程序生成 以平均值为波动的随机砍价算法 此算法有点low
但是可以实现基本上 以平均值为波动的 目前只能满足 平均值小于10和小于100的算法实现
如果基数小那么可以有更好的算法 因为公司要求500元得价格 大约300-400人才能获得。。。所以如果波动很大 那么会有更多的重复值
只做一个参考 demo 用吧
最后求得数组 总价格会有偏差 但是基本上多出0.1来也可以忽略不计
代码里得注释可以忽略 基本上没啥用 有的也没删除。。。
*/
<?php
function suanfa($money,$people,&$arr,&$nowmoney){
$sheng_money = 0;
$sheng_people = 0;
$num=0;
//先求平均值
//
$pinjun = round($money/$people,2);
// echo $pinjun;exit;
$i=0;
$j=0;
if($pinjun<10){
$pinjun_num = $pinjun*100;
$jia = 0.01;
$jian=0.01;
if($people>($pinjun_num*2)){
for($i=0;$i<$pinjun_num;$i++){
$arr[$i] = $pinjun+$jia;
$jia=$jia+0.01;
}
for($i=0;$i<($pinjun_num-1);$i++){
$arr[$i+$pinjun_num]=round(($pinjun-$jian)*100,2)/100;
$jian=$jian+0.01;
}
//如果大于他 会有剩下的值
$count_num = count($arr);
$sheng_num = $people-$count_num;
//echo $sheng_num;//151 之前是249;
//或许不用
//求一下剩余的总价
$nowmoney = array_sum($arr);
$sheng_money = $money-$nowmoney;
for($i=$count_num;$i<$people;$i++){
//最后一个
if($i==$people-1){
$arr[$i] = round($money-array_sum($arr),2);
if($arr[$i]<0.01){
$arr[$i] = 0.01;
}
}else{
if($i==$count_num){
$arr[$i] = round(round(($sheng_money/$sheng_num*1.5)*100,2)/100,2);
if($arr[$i]<0.01){
$arr[$i] = 0.01;
}
$hai_shengxia_money = $sheng_money-$arr[$i];
$sheng_num--;
}else{
$arr[$i] = round(round(($hai_shengxia_money/$sheng_num*1.5)*100,2)/100,2);
if($arr[$i]<0.01){
$arr[$i] = 0.01;
}
$hai_shengxia_money = $hai_shengxia_money-$arr[$i];
$sheng_num--;
}
}
}
if(array_sum($arr)<$money){
$arr[0] += round(($money-array_sum($arr) )*100,2)/100;
}
}else{
//$pingjun=2.5;
for($i=0;$i<($people/2);$i++){
$arr[$i] = $pinjun+$jia;
$jia=$jia+0.01;
}
for($i=0;$i<($people/2);$i++){
$arr[$i+$people/2]=round(($pinjun-$jian)*100,2)/100;
$jian=$jian+0.01;
}
if(array_sum($arr)<$money){
$arr[0] += round(($money-array_sum($arr) )*100,2)/100;
}
}
}elseif($pinjun<100){
$pinjun_num = $pinjun*100;
$jia = 0.1;
$jian=0.1;
if($people>($pinjun_num*2)){
for($i=0;$i<$pinjun_num;$i++){
$arr[$i] = $pinjun+$jia;
$jia=$jia+0.1;
}
for($i=0;$i<($pinjun_num-1);$i++){
$arr[$i+$pinjun_num]=round(($pinjun-$jian)*100,2)/100;
$jian=$jian+0.1;
}
//如果大于他 会有剩下的值
$count_num = count($arr);
$sheng_num = $people-$count_num;
//echo $sheng_num;//151 之前是249;
//或许不用
//求一下剩余的总价
$nowmoney = array_sum($arr);
$sheng_money = $money-$nowmoney;
for($i=$count_num;$i<$people;$i++){
//最后一个
if($i==$people-1){
$arr[$i] = round($money-array_sum($arr),2);
if($arr[$i]<0.1){
$arr[$i] = 0.1;
}
}else{
if($i==$count_num){
$arr[$i] = round(round(($sheng_money/$sheng_num*1.5)*100,2)/100,2);
if($arr[$i]<0.1){
$arr[$i] = 0.1;
}
$hai_shengxia_money = $sheng_money-$arr[$i];
$sheng_num--;
}else{
$arr[$i] = round(round(($hai_shengxia_money/$sheng_num*1.5)*100,2)/100,2);
if($arr[$i]<0.1){
$arr[$i] = 0.1;
}
$hai_shengxia_money = $hai_shengxia_money-$arr[$i];
$sheng_num--;
}
}
}
if(array_sum($arr)<$money){
$arr[0] += round(($money-array_sum($arr) )*100,2)/100;
}
}else{
//$pingjun=2.5;
for($i=0;$i<($people/2);$i++){
$arr[$i] = round(($pinjun+$jian)*100,2)/100;//$pinjun+$jia;
$jia=$jia+0.1;
}
for($i=0;$i<($people/2);$i++){
$arr[$i+$people/2]=round(($pinjun-$jian)*100,2)/100;
$jian=$jian+0.1;
}
if(array_sum($arr)<$money){
$arr[0] += round(($money-array_sum($arr) )*100,2)/100;
}
}
}
}
$money = 199;
$people = 5;
$arr = array();
$nowmoney = 0;
suanfa($money,$people,$arr,$nowmoney);
echo array_sum($arr);
shuffle($arr);
//print_r($arr);exit;
echo(json_encode($arr));exit;
/*
ALTER TABLE `hhs_activity_data`
ADD COLUMN `probability` text NOT NULL AFTER `ext3`;
还得改表的字段 不能用int
总价格500 人数30
数组最后的总价500.1
Array
(
[0] => 16.77
[1] => 16.87
[2] => 16.97
[3] => 17.07
[4] => 17.17
[5] => 17.27
[6] => 17.37
[7] => 17.47
[8] => 17.57
[9] => 17.67
[10] => 17.77
[11] => 17.87
[12] => 17.97
[13] => 18.07
[14] => 18.17
[15] => 16.57
[16] => 16.47
[17] => 16.37
[18] => 16.27
[19] => 16.17
[20] => 16.07
[21] => 15.97
[22] => 15.87
[23] => 15.77
[24] => 15.67
[25] => 15.57
[26] => 15.47
[27] => 15.37
[28] => 15.27
[29] => 15.17
)
这个是总价格500 人数400
最后求得的数组总价500
Array
(
[0] => 1.26
[1] => 1.27
[2] => 1.28
[3] => 1.29
[4] => 1.3
[5] => 1.31
[6] => 1.32
[7] => 1.33
[8] => 1.34
[9] => 1.35
[10] => 1.36
[11] => 1.37
[12] => 1.38
[13] => 1.39
[14] => 1.4
[15] => 1.41
[16] => 1.42
[17] => 1.43
[18] => 1.44
[19] => 1.45
[20] => 1.46
[21] => 1.47
[22] => 1.48
[23] => 1.49
[24] => 1.5
[25] => 1.51
[26] => 1.52
[27] => 1.53
[28] => 1.54
[29] => 1.55
[30] => 1.56
[31] => 1.57
[32] => 1.58
[33] => 1.59
[34] => 1.6
[35] => 1.61
[36] => 1.62
[37] => 1.63
[38] => 1.64
[39] => 1.65
[40] => 1.66
[41] => 1.67
[42] => 1.68
[43] => 1.69
[44] => 1.7
[45] => 1.71
[46] => 1.72
[47] => 1.73
[48] => 1.74
[49] => 1.75
[50] => 1.76
[51] => 1.77
[52] => 1.78
[53] => 1.79
[54] => 1.8
[55] => 1.81
[56] => 1.82
[57] => 1.83
[58] => 1.84
[59] => 1.85
[60] => 1.86
[61] => 1.87
[62] => 1.88
[63] => 1.89
[64] => 1.9
[65] => 1.91
[66] => 1.92
[67] => 1.93
[68] => 1.94
[69] => 1.95
[70] => 1.96
[71] => 1.97
[72] => 1.98
[73] => 1.99
[74] => 2
[75] => 2.01
[76] => 2.02
[77] => 2.03
[78] => 2.04
[79] => 2.05
[80] => 2.06
[81] => 2.07
[82] => 2.08
[83] => 2.09
[84] => 2.1
[85] => 2.11
[86] => 2.12
[87] => 2.13
[88] =&g