1

我正在编写一个用于统计的小应用程序。这个应用程序的一个功能是确定一个Array包含 100 个元素的随机生成数字的频率。

到目前为止,我设法生成了一个用数字 0-100 填充的二维Array(这些是另一个中随机生成的数字的最大值和最小值Array)。

我想用基于索引的频率填充这个数组。

像这样:

//Array for random numbers
int[] randomNumbers = new int[10] {2, 3, 4, 5, 5, 2, 8, 9, 3, 7};

//Two-dimensional array for holding frequency of each unique number
int[,] frequency = new int[2,101];

for (int i = 0; i <= 100; i++)
{
    frequency[0, i] = i;
}

频率阵列生成良好。但我不知道从这里去哪里。如何将每个唯一数字的频率添加到数组中?我试过这个:

for (int i = 0; i < randomNumbers.Length; i++)
{
    frequency[1, i] = frequency[1, i] + 1;
} 

但它只是不断地用频率阵列填充频率阵列。

4

6 回答 6

12

GroupBy使这非常简单。

var frequencies = randomNumbers.GroupBy(n => n)
    .Select(group => new 
             {
                Number = group.Key, 
                Frequency = group.Count() 
             });
于 2013-06-06T14:25:04.693 回答
2

You should be able to do this:

int[] randomNumbers = new int[10] {2, 3, 4, 5, 5, 2, 8, 9, 3, 7};

Dictionary<int, int> dictionary = new Dictionary<int,int>();

foreach(int randomNumber in randomNumbers)
{
    if (!dictionary.ContainsKey(randomNumber))
        dictionary.Add(randomNumber, 1);
    else
        dictionary[randomNumber]++;
}

If you then want to sort them, use Linq...

var sortedList = from pair in dictionary
    orderby pair.Key
    select pair;
于 2013-06-06T14:46:48.263 回答
2

对我来说,看起来 aDictionary<int, int>最适合您的需求:

Dictionary<int, int> frequency = new Dictionary<int, int>();

foreach (int number in randomNumbers)
{
    if (frequency.ContainsKey(number))
        frequency[number]++;
    else
        frequency.Add(number, 1);
}

int numberOfGroups = frequency.Count;
于 2013-06-06T14:31:49.170 回答
2

我会这样做,你在频率表中有索引作为数字的值,实际值是频率(就像不完全一样):

for (int i = 0; i <= 100; i++)
{
    frequency[i] = randomNumbers.SelectMany( o=>o.ArrayProperty==i ).Count() ;
}
于 2013-06-06T14:28:48.487 回答
2

您可能会发现拥有两个数组很有用,每次生成随机数时,您会将第一个数组的下一个元素设置为该数字,并将第二个数组的随机数元素设置为自身 +1。这将从一开始就为您提供统计信息(来自随机数生成器的 POV。

int[] vals, stats;

vals = new int[100]
stats = new int[100]

for (int i = 0; i < 100; i++)
{
    vals[i] = getRandom();
    stats[vals[i]] = stats[vals[i]] + 1;
}

像这样的东西可能会奏效:)

于 2013-06-06T14:26:47.623 回答
2

我想你正在寻找这样的东西:

int[] randomNumbers = ...;
int[] frequency = new int[101];
for (int i = 0, l = randomNumbers.Length; i < l; ++i)
    ++frequency[randomNumbers[i]];

这样做的结果是frequency数组包含每个索引的出现次数。换句话说,frequency[0]将包含 value 的出现次数0frequency[1]将包含 value 的出现次数1,等等......

于 2013-06-06T14:27:25.767 回答