2012-09-14 93 views
3

可能重複:
Count Frequency in a Randomly Generated List of Numbers數組和隨機數:算時間是隨機產生的整數

我目前正在與數組和隨機數工作。我創建了一個表單,可以讓我使用textbox1從1到20中生成隨機數,以選擇顯示的數字數量。我在多行文本框2中顯示結果。我已經能夠計算出所產生的這組數的總和和平均值。

我的第二步驟:

有沒有去帳簿或標記產生數倍,在多行的文本框(最後一個圖片)顯示呢?我是否需要創建一個數組並使其充滿零?

private void button1_Click(object sender, EventArgs e) 
{ 
    int n = Convert.ToInt32(textBox1.Text); 
    int[] y = new int[n]; 
    double sum = 0; 

    for (int i = 0; i < n; i++) 
    { 
     int x = 1 + r.Next(20); 
     y[i] = x; 
     sum += x; 

     if (n < 101) 
      textBox2.AppendText(x + " "); 
    } 

    double avg = sum/n; 
    textBox2.AppendText(Environment.NewLine + sum + " " + avg + Environment.NewLine); 

    double vsum = 0; 

    for (int i = 0; i < n; i++) 
     vsum += (y[i] - avg) * (y[i] - avg); 
}  

Form.cs

enter image description here

計數次數的整數是隨機選擇的

enter image description here

+0

@Thilo:這是一個java問題。 –

+0

@NikhilAgrawal:出於某種原因,那裏的答案似乎仍然適用。 – Thilo

回答

2

下面是可以做的代碼你想要什麼:

 var r = new Random(); 
     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[] 
     { 
      "Results", 
      String.Format("{0} {1}", sum, avg), 
     }.Concat(Enumerable 
      .Range(1, 20) 
      .Select(x => String.Format("{0} ({1}x)", x, frequency[x].Count())))); 

25值運行此我得到這個結果:

Results 
278 11.12 
1 (0x) 
2 (2x) 
3 (1x) 
4 (1x) 
5 (1x) 
6 (2x) 
7 (0x) 
8 (1x) 
9 (2x) 
10 (4x) 
11 (1x) 
12 (0x) 
13 (0x) 
14 (0x) 
15 (2x) 
16 (1x) 
17 (2x) 
18 (2x) 
19 (3x) 
20 (0x) 

這就是你所追求的?

+0

+1是的!謝謝。有一件事:是否有顯示每個會話產生的數字? – techAddict82

+0

@ charliecodex23 - 您應該可以從我已經提供的代碼中爲您自己解決問題。祝你好運。 – Enigmativity

+0

是的你的權利。我忘記提及的另一件事:一個數字被隨機挑選的時間的結果被添加了不同的時間button1被點擊。所以,如果我點擊和數字4被挑選是4(1),如果我再次點擊和數字4被挑選然後4(2) – techAddict82

3

「我需要創建一個數組並使其充滿零?「

是的,那將是一個好的開始。

有一個計數器陣列(全部最初爲零)並計算每個數字出現的次數。

+0

+1感謝朋友的部分回答。你能告訴我怎麼做? – techAddict82

+0

這與您現在如何填充數組'y'非常相似。 – Thilo

0

您可以添加一個重要的Dictionary<int, int> counter。後int x = ...

if (counter.ContainsKey(x)) 
    counter[x]++; 
else 
    counter.Add(x, 1); 

此後字典適用於您創建的每個不同的隨機數,它已經創造了時間的頭號鍵值對插入的行。您也可以使用字典來完全替換y陣列。

0

你也可以做一個

Dictionary<int,int> 

店問題爲重點(第一INT) 店作爲價值產生的次數(第二INT)的數量。

Dictionary<int,int> numbers = new Dictionary<int,int>(); 
//initialize dictionary 
for (int i = 1; i < 21; i++) 
{ 
    numbers.Add(i,0); 
} 

//this only covers generating number and adding to dictionary 
Random random = new Random(); 
int nextNum = random.NextInt(1,20); 
numbers[nextNum]++; 

參考文獻:

http://www.dotnetperls.com/keyvaluepair

http://msdn.microsoft.com/en-us/library/xfhwa508.aspx

+1

'numbers [nextNum] ++;'當鍵未找到時會拋出異常。 – Jan

+0

已修復。我的解決方案現在初始化將要使用的密鑰 – tehdoommarine

+0

仍是同樣的問題。 '數字[i] = 0;''會拋出一個異常,因爲鍵'i'不在字典中。 – Jan