抽人程式介紹
代碼以及應用程式連結
用 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:
// 用來計算僞随機數序列起始值的數字。如果指定的是負數,則使用其絕對值。