100分求一个随机数生成的算法

程序员周瑜 2015-08-01 06:11:07
500000元分给1000000个人,每个人分0.18到88元,正好分完。请问如何使用算法实现?
...全文
229 点赞 收藏 5
写回复
5 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
y75674952 2015-08-05

$arr = array(); //每个人所得的钱
$k = 500 ;   //总金额
$j = 1000 ;  //总人数
$sum = 500 ; //剩余总数
$surplus = 0 ;
$s = 0 ; //剩余人数
for($i=1;$i<=$j;$i++){
    $s = $j - $i ;
    if($s == 10){       
        $surplus = number_format($sum / $s,5);//只要控制最后的平均数,就可以做到在成本以下,不控制会高出小数点
        //$surplus = number_format($sum / $s,5) - 1;
    }
    if($s < 10){             
        $arr[$i] = $surplus;
        continue;
    }
    $rand = rand(18,800) / 100;    //随即金额
    
    if($sum / $s < $k / $j){        //如果当前金额/当前人数 < 总额的0.5 那么之后随即就在0.5以下随即.否则可以随即高数
        $rand = rand(18,50) / 100;
        $sum = $sum - $rand;
        $arr[$i] = $rand ;
    }else{
        $sum = $sum - $rand;
        $arr[$i] = $rand ;
    }
}
//print_r($arr);
print_r(array_sum($arr));
exit;
我放小了100倍,,大概每次随即都只是多出小数点,也可以控制到金额以下, 也可以控制到完全OK. 后面就简单..我就不写了. 这样就差不多了.
回复
果酱很好吃 2015-08-03
简单的,复杂的搞不来,计算你那个 500000,1000000 要计算几分钟 缺点,没有最大值,钱都比较平均,做个参考吧.....

$res=redbag(500,1000,20,0.18);
echo 'count:'.array_sum($res).'<br>';
echo max($res).' - '.min($res);
echo "<pre>";
print_r($res);
echo "</pre>";

function redbag($money ,$count ,$max ,$min){
	$avg = $money / $count;
	if($max < $avg){
		$max = $avg;
	}

	$res=array();
	for($i = 0; $i < $count; $i++) {
		$tmpm = mrand($min, $max);
		$res[$i] = $tmpm;
		$money -= $tmpm;
	}

	while ($money > 0) {
		for ($i = 0; $i < $count; $i++) {
			if ($money > 0 && ($res[$i]+$avg) <= $max) {
				$res[$i] += $avg;
				$money -= $avg;
			}
		}
	};
	while ($money < 0) {
		for ($i = 0; $i < $count; $i++) {
			if ($money < 0 && ($res[$i]-$avg) >= $min) {
				$res[$i] -= $avg;
				$money += $avg;//money 0.019999999999999 在最后几步出现的,不知道是什么鬼,上一步是 -0.98 + 1
			}
		}
	};

	if($money > 0){
		$res[0] += sprintf("%.2f", $money);
	}
	return $res;
}

function mrand($min,$max){
	$tmpmin = $min * 100;
	$tmpmax = $max * 100;
	return rand($tmpmin,$tmpmax) / 100;
}
回复
kis龍 2015-08-03
留名,等大神解答
回复
夏之冰雪 2015-08-03
每人最少0.18,先把这些去除,还剩32w元。 这些钱随机进行分配,设计一个正态分布,最高点是0.32。得到所有数据,这些数据再打散,分给随机的所有人即可。
回复
xuzuning 2015-08-01
前 999999 个人分完 500000 - (0.18到88之间的数) 第1000000个人得剩余值(限定在0.18到88之间) 可依次向前迭代 也可 1000000个人均分500000 然后每2人正负波动一次
回复
相关推荐
发帖
PHP
创建于2008-08-27

1.9w+

社区成员

“超文本预处理器”,是在服务器端执行的脚本语言,尤其适用于Web开发并可嵌入HTML中。PHP语法利用了C、Java和Perl,该语言的主要目标是允许web开发人员快速编写动态网页。
申请成为版主
帖子事件
创建了帖子
2015-08-01 06:11
社区公告
暂无公告