2005年底的健康檢查結果

去年年底做的健康檢查報告結果出來了.
S.G.P.T (ALT) 血清麩丙酮酸轉胺基與 TRIGLYER IDE 中性脂肪仍然是偏高.脂肪肝看來仍然沒改善。
血清麩丙酮酸轉胺基:代表肝細胞受損程度。慢性肝炎、酒精性肝障礙、肝硬化、肝癌都會造成值偏高。有脂肪肝者也會有稍高的情況。
TRIGLYER IDE 中性脂肪:亦即三酸甘油酯,表示可能攝取過多醣類及碳水化合物。
醫生的建議:不要過度勞累或熬夜,少吃醣類及澱粉類的食物,多運動。最後要定期追蹤肝功能。

樂透下期號碼預測(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 人去買的話,至少會有一人中獎.
不過,還是覺得怪怪的…這數字會不會太小了呢??

樂透下期號碼預測(1)

之前騎車的時候想到的一個 idea,想要來預測下期樂透的號碼.
以亂數取某數字,理論上,當次數越趨近於無限的時候,每個數字出現的機率會趨近於相等.
所以我們寫了這麼一個程式來驗證其正確性:
using System;
using System.Collections;

public class MyClass
{
    public static void Main()
    {
        Random r = new Random();
        int[] statistics = new int[43];
        int i=0;
        int sum=0;
        
        // initialize
        for( i=0; i<statistics.Length; i++ )
            statistics[i]=0;
            
        for( i=0; i<100000; i++ )
        {
            // int index = Convert.ToInt32( 41*r.NextDouble()+1 );
            int index = r.Next(42)+1;
            statistics[ index ] = statistics[ index ] + 1;
        }
        
        for( i=0; i<statistics.Length; i++ )
        {
            Console.WriteLine( "statistics[{0}] = {1}", i, statistics[i] );
            sum+=statistics[i];
        }
        Console.WriteLine( "sum={0}", sum );
            
        RL();
    }
    
    #region Helper methods
    private static void RL()
    {
        Console.ReadLine();    
    }
    #endregion
}
這邊遇到一件很有趣的事情,如果你用 41*r.NextDouble()+1 來取的話
結果會是最前面數字與最後面數字出現的機率會比其他數字要少了約一倍.
所以這樣取會比較好些: r.Next(42)+1
另外我們捨棄 [0] 不用,純使用 [1] ~ [42], 以方便我們的統計.
參考資料:

…待續…

聊人資系統(1)

我現在的工作跟人資一點關係都沒有,寫這一系列文章主要是想紀錄以前作人資系統時對人資系統的認識以及當時遇到的一些情況.
人資系統,即人事薪資系統.大致可以分成這幾個子系統:

  • 人事
  • 薪資
  • 出勤
  • 考核

整個系統最終的目的,都是為了要能核發薪資(應該說提供薪資資料給會計財務,由會計財務去作帳及匯款).
人事,提供人員的基本資料,職位調動資料,工地異動資料,勞健保的加退保,退休金提撥,人員統計.
出勤,提供人員的請假紀錄,出勤狀況.
考核,讓主管或人員相互評核,以作為核發獎金的參考依據.

CheckSum

CheckSum 是一個很簡單的檢查方法,把內容拆解成一堆 byte (或word,dword), 如果把這些 bytes 相加起來得到的值一致,表示內容”應該”是沒問題.

using System;
using System.IO;
using System.Collections;

public class CheckSum
{
    private long sum=0;
    
    public CheckSum()
    {
    }

    public void Add( int i )
    {
        sum += i;
    }
    
    public void Add( byte b )
    {
        sum += b;
    }
    
    public long GetCheckSum()
    {
        return sum;
    }
}

public class MyClass
{
    public static void Main()
    {
        string filename;
        FileStream fs=null;
        CheckSum sum = new CheckSum();
        
        //Open the stream and read it back.
        Console.Write( "Please input filename:" );
        filename = Console.ReadLine();
        Console.WriteLine( "Trying to read {0}", filename );
        
        if( File.Exists( filename ) )
            Console.WriteLine( "{0} is existed.", filename );

        try
        {
            fs = File.Open( filename, FileMode.Open, FileAccess.Read );
            
            if( fs.CanRead )
            {
                int value=0;
                
                while( (value = fs.ReadByte()) >= 0)
                {
                    sum.Add( value );
                }
                
                Console.WriteLine( "Checksum = {0,8:x}", sum.GetCheckSum() );
            }
            else
                Console.WriteLine( "Cannot be read" );
        }
        catch( Exception ex )
        {
            Console.WriteLine( ex.Message );
        }
        finally
        {
            fs.Close();
        }
        
        RL();
    }
    
    #region Helper methods
    private static void RL()
    {
        Console.ReadLine();    
    }
    #endregion
}

城裡的月光

前一陣子把許美靜的”靜聽精彩13首”又拿出來聽,霎時間突然又回到快退伍的那段時光.
記得那時候許美靜也是個唱遍港台東南亞的歌手呢~
可是後來又出了一兩張唱片之後,旋即銷聲匿跡,不知道到哪兒去了…
特別喜歡他唱的”城裡的月光”與”鐵窗”,可能是跟當時在當兵有關係吧…
當兵的時候,常熬夜打資料,深夜回去睡的時候,看到撒滿地的月光跟掛在天上的月亮.
再想到,沒辦法回家,被關在兵營裡,眼淚就會不太爭氣地流下來…
城裡的月光
詞:陳佳明
曲:陳佳明
專輯:靜聽精彩13首
主唱:許美靜
每顆心上某一個地方 總有個記憶揮不散
每個深夜某一個地方 總有個最深的思量
世間萬千的變幻 愛把有情的人分兩端
心若知到靈犀的方向 那怕不能夠朝夕相伴
城裡的月光把夢照亮 請溫暖他心房
看透了人間聚散 能不能多點快樂片段
城裡的月光把夢照亮 請守候他身旁
若有一天能重逢 讓幸福撒滿整個夜晚

2005尾牙抽獎風波

這次尾牙運氣很好,抽到了一台Notebook,令人非常高興.
這次的抽獎有別於以往,採用電腦程式抽獎,這當然是很好囉,因為抽獎速度加快許多.
但這次不幸的是,程式有問題,許多人重複被抽到.這當然是不被允許的!!也因此,有許多人抱怨.
2005_Year_End_Dinner
還不知道這次能不能順利把notebook抱回家呢.
我已經想好要灌 Fedora Core 5Debian Linux 了說… >_<

最好是這樣

這一兩年常聽到這句話,心裡不以為然…
人永遠希望是在最好的情況,所以當你說這句話的時候,恆為真.
因此, “最好是這樣” 實際上就是 “就是這樣”.

祖父走了

這是我這幾天 MSN 的暱稱: 悄悄地祖父走了,正如他悄悄地來, 揮揮衣袖,不帶走一片雲彩。
是的,祖父就這樣走了.
祖父走的很突然,他的子女都不太能接受這個事實 (從他們口裡還一直念,祖父平常身體很好等等的話,可以聽出來他們的不捨.)
仔細回想,人的生死真的是很難以預料,平時就應該要做好準備.
祖父因為跌倒而送醫,但是跌倒一事可大可小.
星期六下午,他是到圳溝旁邊,想要抽幾根木頭,可是卻腳滑跌落圳溝,圳溝約 2 公尺高,因此而大腿骨斷掉,從外觀可看到一大片瘀血.當時,由於鄉下人家白天經過的人很少(多半都出外工作或移居外面),祖父呼救了約一個小時,才被剛好要出門的鄰居聽見,趕緊救起送新店耕莘醫院.
星期一下午轉台北石牌榮總.
星期一晚上,手術很成功.
星期二早上發生手術後併發症,下午送加護病房,傍晚的時候,情況不妙,決定回家,當晚約八點五十分回到磺窟城祖父家中.
其他情況,誠如我妹所說:

不再贅述.
對祖父唯一的抱歉,就是沒能趕緊生個曾孫出來.
抱歉,祖父,順風.

最大公因數/輾轉相除法

在某論壇看到討論最大公因數的討論串,裡面有提到輾轉相除法.
老實說,當我看到最大公因數,我只想到暴力法.
從 1…n 開始 iterate, 能整除,表示是因數,把這些數字記起來,於是我們得到兩個集合.這兩個集合的交集,表示是共通因數,最大者則為最大公因數.
完全忘記有輾轉相除法這玩意兒,一時興起,port 到 c# 試試看.
using System;
using System.Collections;

public class MyClass
{
    public static int GCD( int a, int b )
    {
        if( a % b == 0 )
            return b;
        return GCD( b, a%b );
    }
    
    public static void Main()
    {
        int num1=1230, num2=460, num3=10;
        
        int result1 = GCD( num1, num2 );
        int result2 = GCD( result1, num3 );
        
        Console.WriteLine( "The GCD of {0} and {1} is {2}", num1, num2, result1 );
        Console.WriteLine( "The GCD of {0} and {1} is {2}", result1, num3, result2 );
        
        RL();
    }
    
    #region Helper methods
    private static void RL()
    {
        Console.ReadLine();    
    }
    #endregion
}