2012-09-14 8 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 방법 내에서만 유효합니다. 당신은 그것을 클릭을 통해 유지하기 위해 개인 클래스 변수로 이동해야합니다. 거기에 도달하려면 코드를 약간 리팩토링해야합니다. 그것의 - 즉 1 ~ 20까지 숫자를 생성하기 위해 의미하므로 위가 rand.next(min,max) 방법을 결합하는 것이

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; 
    } 
} 

참고, 독점, 당신은 (21)가 불일치가 왜 있는지에 1을 통과해야 조금 혼란스러워. 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>입니다.

인스턴스 변수는 로컬 변수가 손실되는 동안 이벤트 핸들러에 대한 호출에서 보존됩니다.