天天看點

簡單分析并實作抽人程式抽人程式介紹能否暗箱操作?如何實作切換不同的檔案随機數的産生

抽人程式介紹

代碼以及應用程式連結

用 C# 制作了一個抽人的 Windows 小程式。

控件部分 : TextBoxt 作為展示 、兩個 Button 作為按鈕 (抽一次、換檔案)、label 作為資訊提示、openFileDialog 控件來打開文本、timer 計時器用來計時定時結束。

功能 : 可以切換不同的 Txt 檔案作為抽取的資料源(需要将抽取項單獨為一行),每點選一次 “ 抽一次 ” 按鈕 文本框中都會切換不同的抽取人,在 1 秒後自動停止顯示随機抽取到的人,實作了無重複、随機抽取的功能。

簡單分析并實作抽人程式抽人程式介紹能否暗箱操作?如何實作切換不同的檔案随機數的産生

能否暗箱操作?

自己寫完一個抽獎小程式後就應該很難相信抽獎的真實性,根據代碼分析。

private void timer1_Tick(object sender, EventArgs e)//計時器啟動
        {
            i++;length++;//擷取計時器啟動時間
            if (arry.Count <= 0)
            {
                timer1.Stop();
                MessageBox.Show("目前無人可抽,請重新選擇檔案", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            else
            {
                if (length >= arry.Count - 1)
                    length = 0;
                textBox1.Text = arry[length];
                if (i == 10)//當 i 等于 10 說明已經經過了一秒 每 100 毫秒執行一次事件 timer1_Tick
                {
                    int tempNum = rdm.Next(0, arry.Count - 1);//在數組有效索引範圍内取随機數
                    textBox1.Text = arry[tempNum];//修改 1 秒 時間到時,顯示的抽中人姓名
                    arry.RemoveAt(tempNum);//移除已抽中人
                    i = 0;
                    timer1.Stop();//停止 timer1_Tick 事件
                }
            }
               
        }
           

從 17 行代碼 textBox1.Text = arry[tempNum] 可見最終顯示結束時展示的姓名或獎品是可以修改或指定的。

現實生活中的所有抽獎,機器博彩大體都是這種套路,在我們相信下一次就能人品爆棚,化身錦鯉時,最終的結果早已被人指定。

是在網際網路時代,一起玩遊戲的是人還是狗都無法确認了,又怎能相信純粹以道德來限制的抽獎呢?

簡單分析并實作抽人程式抽人程式介紹能否暗箱操作?如何實作切換不同的檔案随機數的産生

如何實作切換不同的檔案

借助于 C# 窗體提供的 openFileDialog 控件,對檔案進行讀取和過濾,當選中新檔案後将 fileName 變量改變成新檔案的路徑,在重新抽取時讀取新的資料源。

private void button2_Click(object sender, EventArgs e)
        {
            openFileDialog1.Filter = "(*.txt)|*.txt";//對檔案過濾隻顯示檔案夾以及 .txt字尾檔案
            if (openFileDialog1.ShowDialog() == DialogResult.OK)//将檔案打開的界面顯示,且是否選中了檔案
            {
                fileName = openFileDialog1.FileName;
                readTxt();//自定義的文本讀取函數
            }
        }
           

readTxt() 函數的具體實作

通過 StreamReader 類讀取 txt 文檔,以 「 GB2312 」的編碼格式打開,ReadLine 逐行讀取,并添加至 List, 當所讀取的那一行資料為 null 即讀到資料尾部時,停止讀取,并關閉資料連接配接。

public void readText()
        {
            i = 0; length = 0;
            arry = new List<string>();// arry 是 List<string> 類型,在每次調用 readText() 方法時初始化記憶體,即清空之前的内容
            rdr = new StreamReader(fileName,UnicodeEncoding.GetEncoding("GB2312"));
            string line;
            while ((line = rdr.ReadLine() )!= null)
            {
                arry.Add(line);
            }
            rdr.Close();
        }
           

抽一次按鈕代碼

private void button1_Click(object sender, EventArgs e)//抽一次按鈕功能
        {
            timer1.Stop();/
            timer1.Start();

        }
           

初始定義

StreamReader rdr;
        Random rdm = new Random();
        int i = 0, length = 0;
        List<string> arry;
        string fileName = "RandomPerson.txt";
           

随機數的産生

C# Random 類的定義,采用僞随機數生成器生成随機數。有興趣的朋友可以自行查找定義,原理是 「 線性同餘 」,當 Random 對象的執行個體化和随機數的産生在同一代碼時,很有可能随機産生的數字相同,因為在僞随機數器生成随機數時采用了相同的 「 種子值 」。

維基百科參考

簡單分析并實作抽人程式抽人程式介紹能否暗箱操作?如何實作切換不同的檔案随機數的産生

引申 C# Random 類定義

// 摘要:
        //     使用與時間相關的預設種子值,初始化 System.Random 類的新執行個體。
        public Random();
        //
        // 摘要:
        //     使用指定的種子值初始化 System.Random 類的新執行個體。
        //
        // 參數:
        //   Seed:
        //     用來計算僞随機數序列起始值的數字。如果指定的是負數,則使用其絕對值。