2012-09-14 254 views
1

我目前正在生成隨機數(1-20)並計算每個數字隨機生成的次數。在textBox1我選擇我想要生成的數字的數量。我在多行textBox2中顯示最終結果。我遇到的問題是,每次我再次單擊該按鈕時,它都會重置一個數字隨機生成的次數。生成隨機數:計算隨機生成的x次數

在那裏,我可以點擊按鈕x次的次數,並計算一個數字已被隨機生成的時間,而無需重新設置計數?我正在嘗試通過數組的幫助來實現這個功能。

代碼

public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     Random r = new Random(); 

     private void button1_Click(object sender, EventArgs e) 
     { 


      var n = int.Parse(this.textBox1.Text); 



      var y = 
       Enumerable 
        .Range(0, n) 
        .Select(x => r.Next(20) + 1) 
        .ToArray(); 

      var sum = y.Sum(); 
      var avg = (double)sum/(double)n; 
      var frequency = y.ToLookup(x => x); 

      textBox2.Text = String.Join(Environment.NewLine, new[] 
     { 
      "Number of times an integer was randomly generated", 
      String.Format("{0} {1}", sum, avg), 
     }.Concat(Enumerable 
       .Range(1, 20) 
       .Select(x => String.Format("{0} ({1})", x, frequency[x].Count())))); 

     } 

    } 

回答

3

變量的範圍只存在於button1_Click方法中。您需要將其作爲私有類變量移出才能在點擊之間保留它。它需要對代碼進行一些小的重構以達到目的。

public partial class Form1 : Form 
{ 
    private Random r = new Random(); 

    private int[] counts = new int[20]; 

    private static string newLine = Environment.NewLine; 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     int n = 0; 
     if (int.TryParse(this.textBox1.Text, out n)) 
     { 
      // Clear the box 
      this.textBox2.Text = string.Empty; 

      var generatedList = new int[n]; 
      for (int i = 0; i < n; i++) 
      { 
       // Upper bound is EXCLUSIVE 
       var gen = r.Next(1, 21); 
       counts[gen - 1]++; 
       generatedList[i] = gen; 
      } 

      this.textBox2.Text += PrintNumbers(generatedList); 
      this.textBox2.Text += PrintCounts(this.counts); 
     } 
     else 
     { 
      this.textBox2.Text = "Invalid input! Cannot generate numbers."; 
     } 
    } 

    private static string PrintNumbers(int[] numbers) 
    { 
     if (numbers == null) 
     { 
      return "No numbers generated" + newLine; 
     } 

     string result = "Generated sequence: {"; 
     for (int i = 0; i < numbers.Length; i++) 
     { 
      result += numbers[i]; 

      if (i < numbers.Length - 1) 
      { 
       result += ", "; 
      } 
     } 

     return result + "}" + newLine; 
    } 

    private static string PrintCounts(int[] counts) 
    { 
     if (counts == null) 
     { 
      return string.Empty; 
     } 

     string result = string.Empty; 
     for (int i = 0; i < counts.Length; i++) 
     { 
      result += "Number " + (i + 1) + " generated " + counts[i] + " times." + newLine; 
     } 

     return result; 
    } 
} 

注意的是,上界rand.next(min,max)方法是排他性的,因此,爲了從1到20的數字生成意味着,你需要1把它傳遞給21不知道爲什麼不一致那裏 - 這是有點混亂。

爲n輸出= 10

Generated sequence: {12, 5, 12, 15, 8, 20, 6, 5, 16, 6} 
Number 1 generated 0 times. 
Number 2 generated 0 times. 
Number 3 generated 0 times. 
Number 4 generated 0 times. 
Number 5 generated 2 times. 
Number 6 generated 2 times. 
Number 7 generated 0 times. 
Number 8 generated 1 times.  
Number 9 generated 0 times. 
Number 10 generated 0 times. 
Number 11 generated 0 times. 
Number 12 generated 2 times. 
Number 13 generated 0 times. 
Number 14 generated 0 times. 
Number 15 generated 1 times. 
Number 16 generated 1 times. 
Number 17 generated 0 times. 
Number 18 generated 0 times. 
Number 19 generated 0 times. 
Number 20 generated 1 times. 
+0

+1能否請你告訴我怎麼這陣?根據您的評論。 – techAddict82

+0

一會兒,整理文本框打印部分:) – Jduv

+0

這是完美的!每次點擊後是否保留在一個顯示結果中? – techAddict82

1

你需要記住的一個實例字段的一些數據。要麼是之前在列表中生成的所有數字(這會引入很少的代碼更改),要麼是直方圖本身作爲Dictionary<int, int>

實例字段在局部變量丟失時跨越對事件處理程序的調用而被保留。