关于中奖概率模型正确性的PHP测试脚本验证

上一篇 / 下一篇  2012-05-29 11:26:37 / 个人分类:后端开发与编程

  一般抽奖概率模型一般都是这样设计的:
   比如有三等奖,ABC,A的中奖率是2%,B的中奖率是3%,C的中奖率是5%
   假设所有用户摸到每个号码的概率都是相等的,即在0到100的尺子上,使用rand(0,100)都能随机到一个号码,那么抽奖概率就可以这么设置,指定长度的随机(结果)数即为中奖概率,比如上面的概率2%,可以设置随机到1,2的就能中A等奖,随机到4,5,6的就可以中B等奖,当然中奖长度可交叉,但一般会迁就大奖,避免出现一个人同时中ABC三等奖的情况。
   上面这个中奖概率模型设计,有个很重要的前提,就是每个人抽到每个号码的几率是一样的,也即我们承认了rand(0,100)的公平性,由于中奖概率对抽奖类测试非常重要,为此,小弟设计了以下脚本加以验证:
   php比较灵活,就用php了,大家见谅!
 
<?php
  $i=1;
  //抽奖号码1到100
  while($i<=100){
     $c=0;
    //设计100W个人进行抽奖,每次摸到指定号码i的时候,计数+1 
    for($j=1;$j<=1000000;$j++){
       if($i==rand(0,100)){
         $c++;
       }
     }
    //打印摸到指定号码i的次数
     echo $i." -> "."$c"."\n";
     $i++;
     $arr[]=$c;
  }
  //打印摸到指定号码的次数最大值和最小值
  echo "max"." -> ".max($arr)."\n";
  echo "对应的键名是:".array_search(max($arr),$arr)."\n";
  echo "max"." -> ".min($arr)."\n";
  echo "对应的键名是:".array_search(min($arr),$arr)."\n";
?>
 
以下是结果:
1 -> 9997
2 -> 9999
3 -> 9980
4 -> 9722
5 -> 9976
6 -> 9845
7 -> 10193
8 -> 9969
9 -> 9846
10 -> 9932
11 -> 9901
12 -> 9914
13 -> 9859
14 -> 9920
15 -> 9799
16 -> 9938
17 -> 10017
18 -> 9909
19 -> 9814
20 -> 10022
21 -> 9714
22 -> 10109
23 -> 10113
24 -> 9669
25 -> 10002
26 -> 9885
27 -> 9981
28 -> 9916
29 -> 9956
30 -> 9876
31 -> 9854
32 -> 10027
33 -> 9942
34 -> 9862
35 -> 9851
36 -> 10012
37 -> 10042
38 -> 9815
39 -> 9842
40 -> 10025
41 -> 9907
42 -> 9920
43 -> 9960
44 -> 9901
45 -> 9993
46 -> 9860
47 -> 10075
48 -> 9880
49 -> 9956
50 -> 9892
51 -> 9826
52 -> 9982
53 -> 9938
54 -> 9844
55 -> 9810
56 -> 9804
57 -> 10050
58 -> 9794
59 -> 9855
60 -> 9912
61 -> 9903
62 -> 9826
63 -> 9955
64 -> 10005
65 -> 9793
66 -> 9868
67 -> 9925
68 -> 9776
69 -> 9778
70 -> 9970
71 -> 9935
72 -> 9846
73 -> 9681
74 -> 9704
75 -> 9828
76 -> 9818
77 -> 9933
78 -> 9929
79 -> 9848
80 -> 9915
81 -> 9875
82 -> 10034
83 -> 9806
84 -> 9858
85 -> 9834
86 -> 9980
87 -> 9914
88 -> 9937
89 -> 9702
90 -> 10013
91 -> 9815
92 -> 9787
93 -> 9859
94 -> 9757
95 -> 9884
96 -> 9835
97 -> 9884
98 -> 9816
99 -> 9696
100 -> 9831
max -> 10193
对应的键名是:11
max -> 9669
对应的键名是:11
 
  由上面的结果,我们知道,这100个号码中,每个号码被摸到的几率都是大致相同的,最小/最大次数比接近94%,且随着抽奖人数的增加(比如增加到1000W),比率更接近100%,间接证明了rand(0,100),也即上面的中奖概率模型设计的正确性!

TAG:

 

评分:0

我来说两句

Open Toolbar