3

重複の可能性:
ランダムに生成された数値リストで頻度をカウントする

私は現在、配列と乱数を扱っています。表示される数字の数を選択するために、textbox1を使用して1〜20の乱数を生成できるフォームを作成しました。複数行のテキストボックス2内に結果を表示しています。生成された一連の数値の合計と平均を計算することができました。

私の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

ここに画像の説明を入力してください

整数がランダムに選択された回数を数える

ここに画像の説明を入力してください

4

4 に答える 4

3

「配列を作成してゼロでいっぱいにする必要がありますか?」

はい、それは良いスタートです。

カウンターの配列(最初はすべてゼロ)を用意し、表示された各数値の出現回数をカウントします。

于 2012-09-14T04:06:09.477 に答える
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)

それはあなたが求めているものですか?

于 2012-09-14T04:25:54.593 に答える
0

重要なを追加できDictionary<int, int> counterます。これらの行を後に挿入しますint x = ...

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

その後、ディクショナリは、作成した個別の乱数とそれが作成された回数ごとに1つのキーと値のペアを保持します。y辞書を使用して、配列を完全に置き換えることもできます。

于 2012-09-14T04:13:13.537 に答える
0

また、

Dictionary<int,int>

問題の数値をキー(最初のint)として格納し、生成された回数を値(2番目の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

于 2012-09-14T04:14:54.963 に答える