ホームページ >バックエンド開発 >PHPチュートリアル >赤い封筒を配布するアルゴリズムを見つける

赤い封筒を配布するアルゴリズムを見つける

WBOY
WBOYオリジナル
2016-06-23 13:38:131171ブラウズ

誰もが赤い封筒を掴むゲームをしたことがあります
合計金額と部数を与えるだけで、金額は自動的にランダムに分配されます。

最低金額は 0.01 元です。

アルゴリズム

function($total amount,$赤い封筒の数){

を見つけます。 。 。

$red エンベロープ配列を返す
}


ディスカッションに返信する (解決策)

function distribution($total,$num)
{
if($num return array(); if ($num==1)
return array($total);
$n=rand(1,$total*100/2)/100;
if($num-1> ; =0)
$res=array_merge($res,distribute(($total-$n),$num-1));
return $res; }

print_r(distribute(50, 40));
Array
(
[0] => 17.46

[1] => 7.1

[2] => 4.44
[5] => 0.14
[ 7 ] => 0.46
[9] => 0.1
[12] => 0.47
[13] => ; 0.08
[21] => 0.03
[24] => 0.01
[25] 0.02
[27] => 0.01
[30] => 0.01
[31] 1
[32] => 0.01
[34] => 0
[36] => 0
[ 38] = > 0.01
[39] => -0.080000000000006
)
明らかに間違っています


function distribution($total,$num)
{
if($num return array();
if ($num==1)
return array($total);
$n=rand(1,$total*100/2)/100;
if($num-1> ; =0)
$res=array_merge($res,distribute(($total-$n),$num-1));
return $res; }


this

function distribute($total, $num) {  $avg = $total / $num;  $r = array_fill(0, $num, $avg);  for($i=0; $i<$num; $i+=2) {    $t = rand(1, $avg * 100) / 100;    $r[$i] -= $t;    if($r[$i] <= 0) $r[$i] = 0.01;    $r[$i+1] += $t;  }  $r[$num-1] = $total - array_sum(array_slice($r, 0, -1));  return $r;}
に変更した方が良いかもしれません

これを「This might be bette
function distribute($total, $num) {  $avg = $total / $num;  $r = array_fill(0, $num, $avg);  for($i=0; $i<$num; $i+=2) {    $t = rand(1, $avg * 100) / 100;    $r[$i] -= $t;    if($r[$i] <= 0) $r[$i] = 0.01;    $r[$i+1] += $t;  }  $r[$num-1] = $total - array_sum(array_slice($r, 0, -1));  return $r;}
」に変更します

結果は間違っています
var_dump を使用してそれを取り出しました
100:75
25:17
8:4
4:2
2:1
1:1
0: 1

-1:1
-2:0

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。