3

可能重复:
随机生成的数字列表中的计数频率

我目前正在使用数组和随机数。我创建了一个表单,它可以让我生成 1 - 20 的随机数,并带有一个 textbox1 来选择显示的数字数量。我在多行文本框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);
}     

表格.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);

之后,该字典为您创建的每个不同的随机数及其创建次数保存一个键值对。您还可以使用字典y完全替换数组。

于 2012-09-14T04:13:13.537 回答
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

于 2012-09-14T04:14:54.963 回答