星期三, 2月 01, 2006

[.Net]樂透下期號碼預測(2)

樂透下期號碼預測(2)

今天繼續往下面想以後,發現我以前的想法錯誤了.
本想說,根據歷史資料去統計,以出現次數較少的數字取亂數,又,理論上每個數字出現的次數會趨近一致,所以應該會有較高的機率得到下期中獎的號碼.
回頭想想每期中獎號碼組合機率,應該是以 1 去除以 42 取 6 的所有組合數.

我以排列組合去Google找了很多資料:

要怎麼求組合數呢??我們將樂透的規則套入組合公式:
從 42 個數字中,取 6 個號碼,不論順序,組成一組,不同的組合數為: 排列數/42!

排列組的計算: 42 * (42-1) * (42-2) * (42-3) * (42-4) * (42-5)
42!: 42*41*40*....*2*1

所以寫好以後的程式就是這樣:
using System;
using System.Collections;

public class MyClass
{
    public static double calcP( double totalNumbers, double pickNumbers )
    {
        double possible = 1.0;
        
        for( int i=0; i<pickNumbers; i++ )
            possible = possible * (totalNumbers-i);
            
        return possible;
    }

    public static double calcC( double totalNumbers, double pickNumbers )
    {
        double mShock = 1.0; // m!
        
        for( long i=0; i<pickNumbers; i++ )
            mShock = mShock * (i+1);
        
        double p = calcP( totalNumbers, pickNumbers );
        
        return( p/mShock );
    }

    public static void Main()
    {
        Console.WriteLine( "組合數是: {0}", calcC( 42.0, 6.0 ) );
        
        RL();
    }
    
    #region Helper methods

    private static void RL()
    {
        Console.ReadLine();    
    }
    

    #endregion
}

最後算出來的結果是: 5,245,786
也就是說,如果有 5,245,786 人去買的話,至少會有一人中獎.
不過,還是覺得怪怪的...這數字會不會太小了呢??

沒有留言: