可能重复:
Count Frequency in a Randomly Generated List of Numbers
我目前正在处理数组和随机数。我有一个创建的表单,让我生成1到20的随机数字,用文本框1来选择显示的数字数量。我在多行文本框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
计算随机选择整数的次数
答案 0 :(得分:3)
“我是否需要创建一个数组并使其充满零?”
是的,这将是一个良好的开端。
拥有一系列计数器(最初都为零)并计算出现时每个数字的出现次数。
答案 1 :(得分: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)
这就是你要追求的吗?
答案 2 :(得分:0)
您可以添加重要的Dictionary<int, int> counter
。在int x = ...
if (counter.ContainsKey(x))
counter[x]++;
else
counter.Add(x, 1);
之后,字典为您创建的每个不同随机数及其创建时间保留一个键值对。您也可以使用字典完全替换y
数组。
答案 3 :(得分: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]++;
参考文献: