论坛首页 Java企业应用论坛

由新闻引出的计算概率方法题

浏览 7992 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (1)
作者 正文
   发表时间:2010-06-04  
新闻里应该是5个连号接连摇出,程序模拟的是sort后的5连号,不一样呀

roy 写道
我用程序模拟了一下,竟然有48%的概率,附程序,看看是不是我哪里搞错了
    public static void main(String[] args) {
        int rc = 1000000;
        int mc = 0;
        for (int i = 0; i < rc; i++) {
            List<Integer> ai = genRank();
            int ri = isMatch(ai);
            if (ri > 0) {
                mc ++;
//                System.out.println(ai);
//                System.out.println(ri);
            }
        }
        System.out.println(mc);
    }

    public static List<Integer> genRank() {
        Set<Integer> ai = new HashSet<Integer>();
        Random r = new Random();
        while (ai.size() < 203) {
            ai.add(r.nextInt(786) + 1);
        }
        List<Integer> ri = new ArrayList<Integer>();
        ri.addAll(ai);
        Collections.sort(ri);
        return ri;
    }

    public static int isMatch(List<Integer> ai) {
        for (int i = 0; i < ai.size() - 4; i ++) {
            int ac = ai.get(i) + ai.get(i+1) + ai.get(i+2) + ai.get(i+3) + ai.get(i+4);
            if (ac == ai.get(i) * 5 + 10) {
                return ai.get(i);
            }
        }
        return 0;
    }

0 请登录后投票
   发表时间:2010-06-04  
mikehuhu 写道
新闻里应该是5个连号接连摇出,程序模拟的是sort后的5连号,不一样呀

roy 写道
我用程序模拟了一下,竟然有48%的概率,附程序,看看是不是我哪里搞错了
    public static void main(String[] args) {
        int rc = 1000000;
        int mc = 0;
        for (int i = 0; i < rc; i++) {
            List<Integer> ai = genRank();
            int ri = isMatch(ai);
            if (ri > 0) {
                mc ++;
//                System.out.println(ai);
//                System.out.println(ri);
            }
        }
        System.out.println(mc);
    }

    public static List<Integer> genRank() {
        Set<Integer> ai = new HashSet<Integer>();
        Random r = new Random();
        while (ai.size() < 203) {
            ai.add(r.nextInt(786) + 1);
        }
        List<Integer> ri = new ArrayList<Integer>();
        ri.addAll(ai);
        Collections.sort(ri);
        return ri;
    }

    public static int isMatch(List<Integer> ai) {
        for (int i = 0; i < ai.size() - 4; i ++) {
            int ac = ai.get(i) + ai.get(i+1) + ai.get(i+2) + ai.get(i+3) + ai.get(i+4);
            if (ac == ai.get(i) * 5 + 10) {
                return ai.get(i);
            }
        }
        return 0;
    }


新闻内容:
----------------------------------
接到通知,可到现场参观摇号。通过抽签,季老师成了第一个摇号手。季老师共摇出了50个号,在第15次、18次、32次分别摇出了744号、743号和742号。另一个摇号手在第179次和190次摇出了746号和745号。

两个人摇出的号码,连成了742至746的“五连号”。
----------------------------------
这里说的不是连续摇出啊
0 请登录后投票
   发表时间:2010-06-04  
概率貌似在49左右
0 请登录后投票
   发表时间:2010-06-04  
iaimstar 写道
概率貌似在49左右

是的,超过48.5%
0 请登录后投票
   发表时间:2010-06-09  
最近事情太多,忙的晕头转向。没太多精力研究这个问题。不过零散时间也考虑了下大致有了个计算思路:
1.首先总数量a中取出某个数量g的球的所有组合数量有数学公式可得出a*(a-1)*……*(a-g+1)/g!
2.假设5个球中取3个球,2个球相连的组合如下:
1 1 1 0 0
1 1 0 1 0
1 1 0 0 1
1 0 1 1 0
1 0 1 0 1
1 0 0 1 1
0 1 1 1 0
0 1 1 0 1
0 1 0 1 1
0 0 1 1 1
倒过来看这个组合表,设相连球数为c,那么可以将2个球相连的组合数求法问题分解成:(g个球全选c个球相连数)+(g+1个球,首球必选,剩余g球中任选g-1个,然后c个球相连个数)+……+(a个球,首球必选,剩余a-1球中任选g-1个,然后c个球相连个数)

3.若2有成熟算法,那么2的结果除以1的结果可得概率
0 请登录后投票
   发表时间:2010-06-09  
sjynt131 写道
Mark_Lee 写道
1)先计算在786出现一个5连号的总数有多少: 768-5+1 = 764

2)在计算在203里一个5连号出现的位置总数: 203-5+1 = 199

3)计算符合要求所有出现5连号的总数: 764*199

4)计算768个人选出203人的所有可能总数: 768*767*766* ... *(768-203+1)

步骤3得出的总数除以步骤4得出的总数就是那个概率了,这也太小了,几乎为0


1和4是没问题,但2不对吧,有什么根据?
照你这么算6个球中取3个球,2个连续的概率是:
6-2+1=5
3-2+1=2
2*5/(6*5*4/3/2)=10/20
但实际上是:16/20
1 2 3
1 2 4
1 2 5
1 2 6
1 3 4
1 3 5
1 3 6
1 4 5
1 4 6
1 5 6
2 3 4
2 3 5
2 3 6
2 4 5
2 4 6
2 5 6
3 4 5
3 4 6
3 5 6
4 5 6


汗 的确是有错误 忘记算剩下位的排列了 下面为改正过后的算法

1)先计算在786出现一个5连号的总数有多少: 768-5+1 = 764

2)在计算在203里一个5连号出现的位置总数: 203-5+1 = 199

3)计算剩下的(768-5)个人选出(203-5)人的所有可能总数: 763*762*761* ... *[(768-5)-(203-5)+1]

4)计算符合要求所有出现5连号的总数: 764*199*(步骤3中的总数)

5)计算768个人选出203人的所有可能总数: 768*767*766* ... *(768-203+1)

步骤4的结果除以步骤5的结果即为所求的概率,最后求得概率为199/(768*767*766*765)
0 请登录后投票
   发表时间:2010-06-10  
Mark_Lee 写道
sjynt131 写道
Mark_Lee 写道
1)先计算在786出现一个5连号的总数有多少: 768-5+1 = 764

2)在计算在203里一个5连号出现的位置总数: 203-5+1 = 199

3)计算符合要求所有出现5连号的总数: 764*199

4)计算768个人选出203人的所有可能总数: 768*767*766* ... *(768-203+1)

步骤3得出的总数除以步骤4得出的总数就是那个概率了,这也太小了,几乎为0


1和4是没问题,但2不对吧,有什么根据?
照你这么算6个球中取3个球,2个连续的概率是:
6-2+1=5
3-2+1=2
2*5/(6*5*4/3/2)=10/20
但实际上是:16/20
1 2 3
1 2 4
1 2 5
1 2 6
1 3 4
1 3 5
1 3 6
1 4 5
1 4 6
1 5 6
2 3 4
2 3 5
2 3 6
2 4 5
2 4 6
2 5 6
3 4 5
3 4 6
3 5 6
4 5 6


汗 的确是有错误 忘记算剩下位的排列了 下面为改正过后的算法

1)先计算在786出现一个5连号的总数有多少: 768-5+1 = 764

2)在计算在203里一个5连号出现的位置总数: 203-5+1 = 199

3)计算剩下的(768-5)个人选出(203-5)人的所有可能总数: 763*762*761* ... *[(768-5)-(203-5)+1]

4)计算符合要求所有出现5连号的总数: 764*199*(步骤3中的总数)

5)计算768个人选出203人的所有可能总数: 768*767*766* ... *(768-203+1)

步骤4的结果除以步骤5的结果即为所求的概率,最后求得概率为199/(768*767*766*765)

还是有很大偏差哎,先不论目前计算5连号的方法是否正确,有没有考虑到203个被选出的号中6连号、7连号……203连号的数量。这些都包括5连号的,也该把数量计算在内。
另外你计算786个号中选出203个号所有可能总数的公式也是错误的。应该是768*767*766* ... *(768-203+1) /203!才对。
0 请登录后投票
   发表时间:2010-06-10  
sjynt131 写道
Mark_Lee 写道
sjynt131 写道
Mark_Lee 写道
1)先计算在786出现一个5连号的总数有多少: 768-5+1 = 764

2)在计算在203里一个5连号出现的位置总数: 203-5+1 = 199

3)计算符合要求所有出现5连号的总数: 764*199

4)计算768个人选出203人的所有可能总数: 768*767*766* ... *(768-203+1)

步骤3得出的总数除以步骤4得出的总数就是那个概率了,这也太小了,几乎为0


1和4是没问题,但2不对吧,有什么根据?
照你这么算6个球中取3个球,2个连续的概率是:
6-2+1=5
3-2+1=2
2*5/(6*5*4/3/2)=10/20
但实际上是:16/20
1 2 3
1 2 4
1 2 5
1 2 6
1 3 4
1 3 5
1 3 6
1 4 5
1 4 6
1 5 6
2 3 4
2 3 5
2 3 6
2 4 5
2 4 6
2 5 6
3 4 5
3 4 6
3 5 6
4 5 6


汗 的确是有错误 忘记算剩下位的排列了 下面为改正过后的算法

1)先计算在786出现一个5连号的总数有多少: 768-5+1 = 764

2)在计算在203里一个5连号出现的位置总数: 203-5+1 = 199

3)计算剩下的(768-5)个人选出(203-5)人的所有可能总数: 763*762*761* ... *[(768-5)-(203-5)+1]

4)计算符合要求所有出现5连号的总数: 764*199*(步骤3中的总数)

5)计算768个人选出203人的所有可能总数: 768*767*766* ... *(768-203+1)

步骤4的结果除以步骤5的结果即为所求的概率,最后求得概率为199/(768*767*766*765)

还是有很大偏差哎,先不论目前计算5连号的方法是否正确,有没有考虑到203个被选出的号中6连号、7连号……203连号的数量。这些都包括5连号的,也该把数量计算在内。
另外你计算786个号中选出203个号所有可能总数的公式也是错误的。应该是768*767*766* ... *(768-203+1) /203!才对。

对于6连号、7连号以及更多连号的可能,在步骤3中已经有了体现,因为在5连号(看成是个整体)的前后位置的号都是在剩下的号码中随机获得的,它包含了6连号7连号等可能出现的所有情况
至于步骤5的公式,这是基础的排列知识,没有问题。可以测试一下:例如从4个号 1 2 3 4中随机抽取2个号它的所有可能就为:
1   2        2    3           
2   1        3    2            由左侧排列可知有12种
1   3        2    4           
3   1        4    2            即为 4*(4-2+1) = 12
1   4        3    4
4   1        4    3            如果除以2!结果就是6了
0 请登录后投票
   发表时间:2010-06-10  
sb 记者
0 请登录后投票
   发表时间:2010-06-10  
Mark_Lee 写道
sjynt131 写道
Mark_Lee 写道
sjynt131 写道
Mark_Lee 写道
1)先计算在786出现一个5连号的总数有多少: 768-5+1 = 764

2)在计算在203里一个5连号出现的位置总数: 203-5+1 = 199

3)计算符合要求所有出现5连号的总数: 764*199

4)计算768个人选出203人的所有可能总数: 768*767*766* ... *(768-203+1)

步骤3得出的总数除以步骤4得出的总数就是那个概率了,这也太小了,几乎为0


1和4是没问题,但2不对吧,有什么根据?
照你这么算6个球中取3个球,2个连续的概率是:
6-2+1=5
3-2+1=2
2*5/(6*5*4/3/2)=10/20
但实际上是:16/20
1 2 3
1 2 4
1 2 5
1 2 6
1 3 4
1 3 5
1 3 6
1 4 5
1 4 6
1 5 6
2 3 4
2 3 5
2 3 6
2 4 5
2 4 6
2 5 6
3 4 5
3 4 6
3 5 6
4 5 6


汗 的确是有错误 忘记算剩下位的排列了 下面为改正过后的算法

1)先计算在786出现一个5连号的总数有多少: 768-5+1 = 764

2)在计算在203里一个5连号出现的位置总数: 203-5+1 = 199

3)计算剩下的(768-5)个人选出(203-5)人的所有可能总数: 763*762*761* ... *[(768-5)-(203-5)+1]

4)计算符合要求所有出现5连号的总数: 764*199*(步骤3中的总数)

5)计算768个人选出203人的所有可能总数: 768*767*766* ... *(768-203+1)

步骤4的结果除以步骤5的结果即为所求的概率,最后求得概率为199/(768*767*766*765)

还是有很大偏差哎,先不论目前计算5连号的方法是否正确,有没有考虑到203个被选出的号中6连号、7连号……203连号的数量。这些都包括5连号的,也该把数量计算在内。
另外你计算786个号中选出203个号所有可能总数的公式也是错误的。应该是768*767*766* ... *(768-203+1) /203!才对。

对于6连号、7连号以及更多连号的可能,在步骤3中已经有了体现,因为在5连号(看成是个整体)的前后位置的号都是在剩下的号码中随机获得的,它包含了6连号7连号等可能出现的所有情况
至于步骤5的公式,这是基础的排列知识,没有问题。可以测试一下:例如从4个号 1 2 3 4中随机抽取2个号它的所有可能就为:
1   2        2    3           
2   1        3    2            由左侧排列可知有12种
1   3        2    4           
3   1        4    2            即为 4*(4-2+1) = 12
1   4        3    4
4   1        4    3            如果除以2!结果就是6了

你这是排列,但题目应该是组合。1,2或2,1是一样的结果,题目并不要求连续摇出5连号,而是摇完号后总体再看是否有5连号。不论是先摇出2后摇出3,还是先摇出3后摇出2,结果的概率计算应该是一样的
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics