抽奖砍价之类以均值为基础的波动算法 demo版本

<?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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值