有一位朋友他用PHP做“转盘抽奖”的功能。它的算法以及逻辑它自己都已经全部搞定了。
但是:我朋友现在他有一个需求:开的奖项个数是后台设置的,可以设置任何数?可以有3个奖项,也可以有5个奖项,甚至12个奖项.......每个奖项的角度也是随机数,又如何解决?
不知道大家有没有接触过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代码如下:
- <?php
- $one=mt_rand(1,360);
- $two=mt_rand(1,360-$one);
- $three=mt_rand(1,360-$one-$two);
- $four=mt_rand(1,360-$one-$two-$three);
- $five=360-$one-$two-$three-$four;
- echo "$one - $two - $three -$four- $five <br>";
- echo $sum=$one+$two+$three+$four;
多刷新几下,结果如下:
169 - 156 - 34 -1- 0
360
从上面可以看出,会造成有一个数为0,因为它前4个数已经够了360,最后一个数只能是0;
这样肯定是有问题的对吧!因此我做了一个调整。
方案二:
PHP代码如下:
- <?php
- $n=5;//开的奖项个数
- $angle=360;//中奖转盘总角度数
- $avg=$angle/$n;//假设每个奖项的角度最大值是平均值,这值可以修改,例如:$avg=$angle/($n-1)
- $one=mt_rand(1,$avg);
- $two=mt_rand(1,$avg);
- $three=mt_rand(1,$avg);
- $four=mt_rand(1,$avg);
- $five=$angle-$one-$two-$three-$four;
- echo "$one - $two - $three - $four - $five <br>";
- $sum=$one+$two+$three+$four+$five;
- echo "总角度:$sum";
结果如下:
46 - 48 - 60 - 71 - 135
总角度:360
由于我朋友是用PHP做“转盘抽奖”功能,因此采用的方案二,毕竟角度不能为0度对吗?而且度数为1度也不怎么好吧?上面的代码开了5个奖项,都是写死的。按照我朋友的要求,他的开奖奖项个数是不定,因此不能写死。我们需要用循环来做。
PHP代码如下:
- <?php
- $n=5;//开的奖项个数
- $angle=360;//中奖转盘总角度数
- $avg=$angle/$n;//假设每个奖项的角度最大值是平均值,这值可以修改,例如:$avg=$angle/($n-1)
- $arr=array();
- for($i=1;$i<$n;$i++){
- $arr[]=mt_rand(1,$avg);
- }
- var_dump($arr);
- $last=$angle-array_sum($arr);
- 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来得到这个值。
提醒:通过代码大家也可以看出来,虽然说两种方案都实现了效果,但是值还是有所不同的,可以根据自己的情况来做相应的改变。拿我朋友这个“转盘开奖”功能来 说,它其实用哪一种方案都是可以的,因为它本身就是后台来控制的。如果每一个奖项角度不满意,我后可以再刷新一下运行一篇这个程序也就可以了。
2018年01月18日 21:32:27 沙发
我正好有一个需求是:php生成指定个数的随机数值并且相加等指定数值;博主彻底解决了我的这个问题。