PHP”随机数相加等于固定值“代码示例

有一位朋友他用PHP做“转盘抽奖”的功能。它的算法以及逻辑它自己都已经全部搞定了。

但是:我朋友现在他有一个需求:开的奖项个数是后台设置的,可以设置任何数?可以有3个奖项,也可以有5个奖项,甚至12个奖项.......每个奖项的角度也是随机数,又如何解决?

 

PHP转盘开奖

 

不知道大家有没有接触过PHP“转盘开奖”功能,很多时候我们做这个功能的时候,都是写死的。

例如:我有6个奖项,每个奖项的平均角度就是360/6=60。

但是:很多时候为了 方便,我们都是直接写死6个数,只要这6个数相加的和等于360这就OK了。

 

我知道很多人的一种思路是这样的,如下:假设我们有5个随机数,5个数相加等于360;

第一个数:one=rand(1,360)

第二个数:two=rand(1,360-one)

第三个数:three=rand(1,360-one-two)

第四个数:four=rand(1,360-one-two-four)

第五个数:five=360-one-two-three-four

 

注意:上面给的这种答案表面上看是没有任何问题的,但是我们在实战的时候100%会出现bug;

下面代码中我用了mt_rand()函数,也可以用rand(),关于rand()和mt_rand()的区别请自行查找资料。

 

方案一:

 

PHP代码如下:

  1. <?php
  2. $one=mt_rand(1,360);
  3. $two=mt_rand(1,360-$one);
  4. $three=mt_rand(1,360-$one-$two);
  5. $four=mt_rand(1,360-$one-$two-$three);
  6. $five=360-$one-$two-$three-$four;
  7. echo "$one - $two - $three -$four- $five <br>";
  8. echo $sum=$one+$two+$three+$four;

 

多刷新几下,结果如下:

169 - 156 - 34 -1- 0

360

 

从上面可以看出,会造成有一个数为0,因为它前4个数已经够了360,最后一个数只能是0;

这样肯定是有问题的对吧!因此我做了一个调整。

 

方案二:

 

PHP代码如下:

  1. <?php
  2. $n=5;//开的奖项个数
  3. $angle=360;//中奖转盘总角度数
  4. $avg=$angle/$n;//假设每个奖项的角度最大值是平均值,这值可以修改,例如:$avg=$angle/($n-1)
  5. $one=mt_rand(1,$avg);
  6. $two=mt_rand(1,$avg);
  7. $three=mt_rand(1,$avg);
  8. $four=mt_rand(1,$avg);
  9. $five=$angle-$one-$two-$three-$four;
  10. echo "$one - $two - $three - $four - $five <br>";
  11. $sum=$one+$two+$three+$four+$five;
  12. echo "总角度:$sum";

 

结果如下:

46 - 48 - 60 - 71 - 135

总角度:360

 

由于我朋友是用PHP做“转盘抽奖”功能,因此采用的方案二,毕竟角度不能为0度对吗?而且度数为1度也不怎么好吧?上面的代码开了5个奖项,都是写死的。按照我朋友的要求,他的开奖奖项个数是不定,因此不能写死。我们需要用循环来做。

 

PHP代码如下:

  1. <?php
  2. $n=5;//开的奖项个数
  3. $angle=360;//中奖转盘总角度数
  4. $avg=$angle/$n;//假设每个奖项的角度最大值是平均值,这值可以修改,例如:$avg=$angle/($n-1)
  5. $arr=array();
  6. for($i=1;$i<$n;$i++){
  7.     $arr[]=mt_rand(1,$avg);
  8. }
  9. var_dump($arr);
  10. $last=$angle-array_sum($arr);
  11. echo "<br> $last";

 

结果如下:

array(4) { [0]=> int(17) [1]=> int(65) [2]=> int(8) [3]=> int(43) }

227

 

做到这里,第5个数就不我说了吧,360-227就是第5个数!$n我样可以通过get或post来得到这个值。

 

提醒:通过代码大家也可以看出来,虽然说两种方案都实现了效果,但是值还是有所不同的,可以根据自己的情况来做相应的改变。拿我朋友这个“转盘开奖”功能来 说,它其实用哪一种方案都是可以的,因为它本身就是后台来控制的。如果每一个奖项角度不满意,我后可以再刷新一下运行一篇这个程序也就可以了。

    A+
发布日期:2017年11月29日 14:53:26  所属分类:PHP
最后更新时间:2018-01-18 21:31:20
付杰
  • ¥ 298.0元
  • 市场价:398.0元
  • ¥ 58元
  • 市场价:58元
  • ¥ 298.0元
  • 市场价:498.0元
  • ¥ 159.0元
  • 市场价:398.0元

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

目前评论:1   其中:访客  0   博主  0

  1. 头像 中原一点红 0

    我正好有一个需求是:php生成指定个数的随机数值并且相加等指定数值;博主彻底解决了我的这个问题。