我試着寫簡單的程序,模擬開獎,我得到了一些行爲,我無法理解,也不能修復:列表更新 - 意外行爲
爲了簡單起見我排除的代碼是無關的問題
程序:點擊它應該得到用戶輸入的六個不同的數字(1和49之間),獲得六個不同的隨機數字(1和49之間)比較它們,並重復獲得隨機數字,並與輸入比較,直到有三場比賽。
什麼是相關的,我調用函數GetResults()上的按鈕單擊並傳遞給它兩個參數(下面的方法定義)。我將其簡化爲按鈕單擊以顯示您。這裏有一些條件和函數調用,但它們正在工作,即使沒有它們也存在問題,所以這就是爲什麼底部圖像示例可能有點不同。
private void btnCheck_Click(object sender, EventArgs e) { lotto.GetResults(3, ref listRndNumLabels); lblMatches.Text = lotto.CurrentMatches.ToString(); lblTryCounter.Text = lotto.NumberOfTries.ToString(); lblBalance.Text = lotto.Balance.ToString() + " zł"; lblThreesAmmount.Text = lotto.ThreesAmmount.ToString(); lblFoursAmmount.Text = lotto.FoursAmmount.ToString(); lblFivesAmmount.Text = lotto.FivesAmmount.ToString(); lblSixesAmmount.Text = lotto.SixesAmmount.ToString(); }
方法GetResults()需要3作爲在端
public void GetResults(int Choice, ref List<Label> listLblRndNum) { _currentMatches = 0; int desiredNumberOfMatches = Choice; // while we got other ammount of matches than three, go again while (_currentMatches != desiredNumberOfMatches) { _numberOfTries++; // get list of mutually exclusive 6 numbers betweeen 1 and 49 var tempList = GetRndNums(); // insert random numbers to list _listLotteryNumbers.Clear(); for (int i = 0; i < 6; i++) { _listLotteryNumbers.Insert(i, tempList[i]); } _balance -= _ticketCost; _currentMatches = 0; // get number of matches for (int i = 0; i < 6; i++) { foreach (int num in _listLotteryNumbers) { if (_listSelectedNumbers[i] == num) { _currentMatches++; } } } //FrmLotto.lbResults.Items.Add(_numberOfTries.ToString() + " - _currentMatches: " + _currentMatches.ToString()); //FrmLotto.lbResults.Items.Add(_numberOfTries.ToString() + " - tempList { " + tempList[0] + " " + tempList[1] + " " + tempList[2] + " " + tempList[3] + " " + tempList[4] + " " + tempList[5] + " }"); //FrmLotto.lbResults.Items.Add(_numberOfTries.ToString() + " - _listLotteryNumbers { " + _listLotteryNumbers[0] + " " + _listLotteryNumbers[1] + " " + _listLotteryNumbers[2] + " " + _listLotteryNumbers[3] + " " + _listLotteryNumbers[4] + " " + _listLotteryNumbers[5] + " }"); //FrmLotto.lbResults.Items.Add(_numberOfTries.ToString() + " - _listSelectedNumbers { " + _listSelectedNumbers[0] + " " + _listSelectedNumbers[1] + " " + _listSelectedNumbers[2] + " " + _listSelectedNumbers[3] + " " + _listSelectedNumbers[4] + " " + _listSelectedNumbers[5] + " }"); // update stats if (_currentMatches == 3) { _threesAmmount++; _balance += 10; } else if (_currentMatches == 4) { _foursAmmount++; _balance += 100; } else if (_currentMatches == 5) { _fivesAmmount++; _balance += 3500; } else if (_currentMatches == 6) { _sixesAmmount++; _balance += 1000000; } //FrmLotto.lbResults.Items.Add(_numberOfTries.ToString() + " - Threes Ammount right after updating: " + _threesAmmount); //FrmLotto.lbResults.Items.Add(""); // this gets out of the loop if user has chosen from ddl to run once, it is irrelevant here if (desiredNumberOfMatches == -1) break; } // finally update Labels with the desired result for (int i = 0; i < 6; i++) { listLblRndNum[i].Text = _listLotteryNumbers[i].ToString(); } }
更新所需的比賽和標籤的列表的數目這是它獲取的隨機數的函數:
public List<int> GetRndNums() { List<int> listRndNums = new List<int>(); Random rndNum = new Random(); for (int i = 0; i < 6; i++) { int myNum = 0; do myNum = rndNum.Next(1, 49); while (listRndNums.Contains(myNum)); listRndNums.Add(myNum); } listRndNums.Sort(); return listRndNums; }
所以程序按預期工作,如果循環運行一次,或者如果有德拉每個循環之後,或者如果我在循環中放置斷點。
否則會出現意外的行爲,對同一個數據循環運行不止一次(對於相同的列表),我不明白爲什麼。
看看圖片:
- 程序運行一次,我點擊按鈕五次,向您展示的結果是罰款:
(順便說一句=Sprawdź=檢查,拉茲=一次, DO pierwszejtrójki=直到3個匹配)
- 而當我選擇3個匹配項時(或者從上面的代碼示例中單擊按鈕),我收到錯誤的結果,循環將多次運行相同的值。
將是幫助非常感激,我學習,我知道的代碼,很多地方還有待改進,許多地方只用於臨時調試的目的。但是,這種行爲,我根本不明白。
http://stackoverflow.com/questions/767999/random-number-generator-only-generating-one-random-number?lq=1 – Steve
只是一個供參考 - 通過你的列表作爲ref參數是多餘的,列表是默認通過引用傳遞的實例 – James