2023年5月23日 星期二

[.net]Mylottery樂透中獎程式練習

最近改版之前喜歡作的樂透開獎程式,不知道為什麼就是喜歡做這種小程式練習自己小專案的執行能力。
這次程式是改版之前第一板之後的第二板,這次多學會一些Linq的技巧,放在這個小專案來練習一下,順便想起要中頭獎的機率低到還是回頭寫Code來得實際。

buy:購買一張彩券,看是否有中獎。
clear: 清除之前購買的彩券紀錄,重新統計資料。
autobuy:自動購買彩券直到中獎為止,若機率太低程式會跑一段時間。


另外可以自行設置要配對的數字個數(中幾個數字Set Match),與可選球池的最大數字(Number1~??)`。所有數字都是隨機產出,不需要手動Key購買的彩券。

程式碼如下:

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Windows.Forms;

namespace Mylotterytest
{
    public partial class Form1 : Form
    {
        private Random myWinnum = new Random();
        private Label[] lbwinnum = new Label[6];
        private TextBox[] tbnum = new TextBox[6];
        private double count = 0;
        private double wincount = 0;
        private int maxNum = 36;
        private int setMatch = 3;
        public Form1()
        {
            InitializeComponent();

            lbwinnum[0] = lb_win1;
            lbwinnum[1] = lb_win2;
            lbwinnum[2] = lb_win3;
            lbwinnum[3] = lb_win4;
            lbwinnum[4] = lb_win5;
            lbwinnum[5] = lb_win6;
            tbnum[0] = tb_lot1;
            tbnum[1] = tb_lot2;
            tbnum[2] = tb_lot3;
            tbnum[3] = tb_lot4;
            tbnum[4] = tb_lot5;
            tbnum[5] = tb_lot6;
        }

        private void btn_buy_Click(object sender, EventArgs e)
        {
            List<int> numlist = new List<int>() ;
            List<int> buynumlist = new List<int>();
            maxNum = Convert.ToInt32(tb_maxNum.Text) + 1;
            for (int i = 0; i < 6; i++)
            {
                buynumlist.Add(Convert.ToInt32(tbnum[i].Text));
            }

            RandomList(numlist);

            for (int i = 0; i < lbwinnum.Length; i++)
            {
                lbwinnum[i].Text = numlist[i].ToString();
            }
            
            var SameNum = numlist.Where(i => buynumlist.Contains(i)).Count();
            lb_match.Text = SameNum.ToString();
            lb_buycount.Text = count.ToString();
            count++;
            if (SameNum >= 3)
                MessageBox.Show("3 Match!");
        }

        private void btn_countclear_Click(object sender, EventArgs e)
        {
            count = 0;
            wincount = 0;
        }
        private void RandomList(List<int> numlist)
        {
            for (int i = 0; i < 6; i++)
                numlist.Add(myWinnum.Next(1, maxNum));

            var same = numlist.GroupBy(x => x).Any(g => g.Count() > 1);
            while (same)
            {
                numlist.Clear();
                for (int i = 0; i < 6; i++)
                    numlist.Add(myWinnum.Next(1, maxNum));
                same = numlist.GroupBy(x => x).Any(g => g.Count() > 1);
            }
            numlist.Sort();
        }

        private void btn_autobuy_Click(object sender, EventArgs e)
        {
            List<int> numlist = new List<int>();
            List<int> buynumlist = new List<int>();
            maxNum = Convert.ToInt32(tb_maxNum.Text) + 1;
            setMatch = Convert.ToInt32(tb_setMatch.Text);
            //count = 0;
            RandomList(numlist);
            RandomList(buynumlist);
            var SameNum = numlist.Where(i => buynumlist.Contains(i)).Count();
            count++;
            while (SameNum < setMatch)
            {
                numlist.Clear();
                buynumlist.Clear();
                RandomList(numlist);
                RandomList(buynumlist);
                SameNum = numlist.Where(i => buynumlist.Contains(i)).Count();
                count++;
            }
            wincount++;
            for (int i = 0; i < lbwinnum.Length; i++)
            {
                lbwinnum[i].Text = numlist[i].ToString();
                tbnum[i].Text = buynumlist[i].ToString();
            }
            lb_match.Text = SameNum.ToString();
            lb_matchcount.Text = wincount.ToString();
            lb_buycount.Text = count.ToString();
            lb_winrate.Text = ((wincount / count) * 100).ToString("0.00000000") + "%";
        }
    }
}

操作起來非常簡單,只需要設定球池最大數以及配對成功數量即可運轉。



要配對三個數字的大樂透原來機率這麼低呀!要中100次需要買5654張樂透才有機會。



看到頭獎的機率,還是回頭是岸吧!腳踏實地賺錢比較實在!


裡面有使用Linq中的GroupBy算是很初階的使用方式,學了Linq才發現程式好玩的地方,如傳言學習Linq就回不去了。好用簡潔方便維護的程式碼真的好吃又不黏牙。


[.net]使用計時器作後台運算使用Stopwatch

最近在統計設備運轉的時間,計時器意外的好用,可以知道每個動作需要花多少時間完成,其中有異常的部份可以抓出發生的頻率以及發生的固定模式。

統計運轉效率也是客戶的需求之一,提昇設備整體速度首要作的是尋找瓶頸工程,在該處動刀才能改善設備速度,降低運轉時間。

這邊自行作一個簡單的範例使用C#提供的Stopwatch,可以紀錄經過時間到毫秒。簡單界面如下圖:



與一般使用Timer的計時器不同,Stopwatch是使用系統時間作紀錄,Timer會佔用運算時間導致不準確的情況。

 
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 public partial class Form1 : Form
    {
        System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();

        public Form1()
        {
            InitializeComponent();
        }

        private void btn_Startsw_Click(object sender, EventArgs e)
        {
            sw.Start();
        }

        private void btn_Stopsw_Click(object sender, EventArgs e)
        {
            sw.Stop();
            label1.Text = sw.Elapsed.TotalSeconds.ToString("0.000") + "(s).";
        }

        private void btn_Resetsw_Click(object sender, EventArgs e)
        {
            sw.Reset();
            label1.Text = "0" + "(s).";
        }
    }


使用Stopwatch統計資料得心應手,簡單方便不受Thread的限制免去處理跨執行序的問題。

2016年1月5日 星期二

反服貿運動始末心得

感謝律師親自前來為我們講解318事件之前的歷史經過,在開始之前其實本人對台灣政治界並不是非常了解,對法律與歷史相關更是死穴,所以原本對政治議題就非常不敏感,雖然不致厭惡的程度,若有一些不同的偏見還請見諒。
        律師一開始的投影片就令人驚訝,沒想到身為一個考過律師執照的投影片是如此令人讚嘆,豐富的文字純白的底色沒有任何圖片與一堆文謅謅的法條,第一眼就如此讓人為之一亮,讓我更想要知道律師之後能充分的解說其內容。演講的途中我真的深刻地體會到台灣真的能實踐自由民主深植人心的理念,全民發表各自言論的自由,與表達各自立場的自由,台灣人真的非常了不起能實踐真正的民主社會實質讚許。律師站在一個非常理解服貿與貨貿會帶給台灣甚麼樣影響的一個角度來評斷政府的作為,雖然不知道真實性與否但我也懷疑政府在通過這些法案是否是給予人民最大利益,亦或是讓少部分的人得取最大利益?其實我也知道大家都是希望台灣人民能取得最大利益且能製造政府與人民雙贏的結果,但這有可能嗎?當然有可能,不去做才是甚麼都不可能。倘若人民能夠真正的監督政府,那麼誰能去真正的監督人民呢?法律?道德?學校?還是自我要求?

        我們學理科的其實只想追求科學的真理,因為那是一股真正能影響我們人和整個社會的力量,我們唯一能想到的就是把自己的本分做好,能否做到最後誰也不知道,只求當下把每一個實驗做得徹底清楚,找到真正的公式或演算法帶給這社會一些許的改變,不過就是一點點作為罷了。

2015年12月10日 星期四

「城市發展下的動物處境」:連流浪也不允許的極度邊緣

「城市發展下的動物處境」:連流浪也不允許的極度邊緣


講師 林憶珊/萬宸禎 台灣動物平權促進會理事長/秘書長 



本次是一個很特別的課程,與這門課程名稱完全不相干的主題總是讓我特別注意其中的含意。

關懷動物一直以來在道德上很難下定義與例證,畢竟人會思考應該是必須受到道德規範,動物擁有的不是思考而是一種在地球上的生物都應該擁有的天性:『直覺』。

曾幾何時人類必須要依靠動物的直覺來完成事情,因人類擁有智慧誤以為直覺並不可靠,但這些動物們即使生存能力與人類差異頗大,但牠們仍然對生命時時抱著極度認真的精神。在我的人生中我並沒有養小狗小貓這類大型的寵物,但是有飼養一隻八哥,在飼養途中知道生命是如此脆弱,牠們要度過每一天可不是開玩笑就可以度過的,對每一天的期許與知道自己甚麼時候該做甚麼事,是不容許他們失誤的,只要沒有做好任何一件事,牠們的生命可能從此就黯然失色,永遠只能躲在黑暗中暗自哭泣。我們難道不是動物嗎?我們是否應該多認識自己該如何努力的生活在這地球上,我們人類的行為其實在地球上真的不是一個動物該會有的行為,可能是因為人會思考,不會用直覺做事情吧。

2015年11月19日 星期四

議題思考與討論 (二) 如何看待「人」是合於道德的?

議題:思考與討論 (二) 如何看待「人」是合於道德的?

講者:李素楨 老師, 中原大學電子系兼任助理教授,中央大學哲學所博士


  最近翻開報紙只見一堆凌亂的新聞報導,邊感嘆記者亂象與我們讀者水準如此地落,邊找尋感興趣的標題。其中翻到一頁國外的研究報導,標題大意為信教是否比不信教擁有更多的道德?記者總是想顛覆一般人觀念的標題吸引讀者眼球討生活,但這個標題並沒有顛覆我的看法,但我還是姑且相信這篇報導會寫出甚麼好東西。

  報導內容單純指出英國實驗室實驗信教的人道德感是否高於不信教的人,實驗也非常簡單區分信教與不信教的兩個群組,並在其他外在環境都一樣的地方比較彼此的作法是否相同或不同。實驗結果很符合記者的期望,信教的人並沒有較多的道德感,反之因為信教的因素導致道德感比不信教的低落。因實驗室只做出此實驗並無探討原因與發表任何相關結果,記者果不其然的自行幻想撰寫批評信教的人可能因心中有歸宿,比不信教的人擁有較高的自尊心,故雖然知道很多道德但是行為做法卻大不相同。

  有趣的是這實驗室不相信這實驗結果,想要找到實驗是否有瑕疵,故再作一個更極端的實驗。他們找一群教導道德倫理的教授與一般教授做對比,探討教導道德倫理這類生命科學的老師是否理當比一般教授具有更高的道德水準。很遺憾的是,這些教導生命科學的老師並沒有符合預期的結果,在對待學生惡質如同一般教授的反應行為,生活上如同一般教授會犯一些亂停車、遲到、衣裝不整、強詞奪理或對待不公等一些一般人都會犯的小錯。這實驗其實一點也不失敗,這表明的是即使是這些學富五車的教授,說的跟做的依然都還是兩回事,即使是信教的人,並不會增加你的道德感,因為道德不是知道或用說的能表現出來的。所以道德其實根本不用說也不用記在心裡,實際去做為人善不做為人不善的其實就很夠了。

2015年11月4日 星期三

議題思考與討論 (一) 安樂死(euthanasia)

議題:議題思考與討論 (一) 安樂死(euthanasia)

講者: 李素楨 老師


安樂死,網路上賦予的定義為:"有好的死亡"或者是"無痛苦的死亡"。

安樂死這個詞對一般人而言應該是最不被察覺的,對於周遭有生重病患者的家屬朋友應該是影響最深的,在這些人眼中安樂死如同是一種痛苦的掙扎,道德與痛苦之間所做出的決定。其實如同之前我的文章裡有寫到,我們都是過客只是同時在同一輛列車上,你跑得比較快我比較慢誰先下車誰還未到站,每個人在同一輛列車中都度過不一樣的時間與空間,生老病死不過是自然的法則沒有人是不會死的,如同人會被生下來之時死亡就是注定會發生一樣。

安樂死不過就只是人人所嚮往的平靜離開這輛列車,如同人被生下來之時總是希望娃娃能夠嚎啕大哭,表示這個嬰兒開始擁有生命力,人生走到盡頭時不免想要平靜安穩地離開也不難理解。但是對於生病這件事,有可能是現代醫療技術尚未完善,也有可能是一時心理因素導致這些生命走向痛苦的十字路口,開始抉擇是否還要繼續在這人生道路奮鬥?但人生不就是無數的選擇無數的平行世界,不管你選擇哪條路這世界都會為你開創一個新的世界,讓你去接受這世界所發生的一切。

人與人的羈絆其實是我們心中的希望,希望平靜的一種目標,希望一種安詳。這條無數多選擇的道路上羈絆不過只是選擇的其中一項,重視人際關係的會把羈絆優先考慮,但相反的重視其他選項的這種關係則被忽略。這世界並沒有對錯,或是說本來的樣貌就是如此罷了,死亡並不可怕如同每一段旅程都有結束的時刻,身邊的人面臨到死亡之時,首要做的事便是先安撫自己接受一切,之後才能放寬心看待這個世界。

2015年10月31日 星期六

李飛飛: 我們如何教導電腦看懂圖像

演講主題: 我們如何教導電腦看懂圖像


講者:李飛飛

影片連結:https://goo.gl/QcroFW

  在這部影片中,我看到了電腦辨識圖片的能力遠遠不及一個三歲小孩所理解的,當然對於我們人類來看這些圖像,他們所透露出的訊息遠遠超出這些畫像裡的每一個像素含的數值。我們人類在以往把所有看到的圖像,和圖像之間的意義連結到我們大腦中,使我們產生非常多的連結,使之產生有意義的事件或是圖形。

這項讓電腦看懂圖像的技術在現代與未來是非常重要的一步,電腦自行學會如何將龐大的圖片資料庫去創建互相的關聯性,並且賦予真正的意義,而不再只是一堆像素堆疊而成的資料。這項技術意味著不只是圖像,其實電腦能做的還可以擴展到其他方向例如聽覺、觸覺、味覺等等。這些不同的技術都是原始於教導電腦做人類的事情,假若電腦能完成人類能做的所有事情,那人類是否將轉型成另一種新生物才是呢?