C# - 如何在数组中找到最常见和最不常见的整数?

时间:2017-04-13 23:37:19

标签: c# arrays random dice

我被要求制作一个带有两个阵列的骰子程序(每个骰子一个)并添加两个结果,例如:2(骰子1)+6(骰子2)= 8。

程序必须滚动骰子100次并每次显示总和。 到目前为止,我可以做到这一点,但该程序还必须显示哪个总和是最频繁的,哪个总和最少。

像这样:sum = [2,2,2,2,3,3,4,4,5,6,6]。最常见的:2;最不常见:5。

我该怎么做?

这就是我的代码的样子:

static void Main(string[] args)
    {
        Random gerador = new Random();
        int[] soma = new int[100];
        int rolagem = 0;

        for(int i = 0; i < soma.Length; i++)
        {
            rolagem = 0;
            rolagem += gerador.Next(6) + 1;
            rolagem += gerador.Next(6) + 1;
            soma[i] = rolagem;
        }

        var mais = soma.GroupBy(item => item).OrderByDescending(g => g.Count()).Select(g => g.Key).First();
        //NEED TO FIND OUT LEAST COMMON SUM

        for (int j = 1; j < soma.Length; j++)
        {
            Console.Write("{0} ", soma[j]);
        }
        Console.WriteLine("Soma mais frequente: {0}, Soma menos frequente: {1}", mais, menos);
        Console.ReadKey();
    }

4 个答案:

答案 0 :(得分:3)

你几乎就在那里,你可以找到同样最不常见的一个:

var array = new[] { 1, 1, 1, 1, 4, 2, 2, 3, 3, 3, 5, 5 };
var result = array.GroupBy(i => i).OrderBy(g => g.Count()).Select(g => g.Key).ToList();

var mostCommon = result.Last();
var leastCommon = result.First();

答案 1 :(得分:1)

如果你有骰子滚动100次的代码,你就非常接近了。您需要做的就是频率计数器。

一对骰子产生2到12之间的数字,包括端值。在进入循环之前创建一个int count[13]数组。

在循环中,每次有两个数字,例如d1d2时,按如下方式递增计数:

count[d1+d2]++;

循环结束后,在索引2和12之间找到数组中的最高和最低数字。最高数字的索引将是具有最高滚动计数的数字;最小数字的索引将是具有最低滚动计数的数字。

答案 2 :(得分:0)

Tuple<int, int> least = new Tuple<int, int>(-1, -1), most = new Tuple<int, int>(-1, -1);
List<int> arr = new List<int> { 2, 2, 2, 2, 3, 3, 4, 4, 5, 6, 6 };
var grp = arr.GroupBy(x => x).Select(x=>x).ToList();

foreach (var item in grp)
{
    if (least.Item2 == -1 || least.Item2>item.Count())
    {
        var x = new Tuple<int, int>(item.Key, item.Count());
        least = x;
    }

    if (most.Item2 == -1 || most.Item2 < item.Count())
    {
        var x = new Tuple<int, int>(item.Key, item.Count());
        most = x;
    }
}

Console.WriteLine("Least : "+least.Item1+" repeated " + least.Item2+"times");
Console.WriteLine("Most : "+most.Item1 + " repeated " + most.Item2 + "times");

或者正如m1kael建议的那样,

Tuple<int, int> least = new Tuple<int, int>(-1, -1), most = new Tuple<int, int>(-1, -1);
List<int> arr = new List<int> { 2, 2, 2, 2, 3, 3, 4, 4, 5, 6, 6 };
var grp = arr.GroupBy(x => x).OrderBy(x=>x.Count()).Select(x => x.Key).ToList();
Console.WriteLine("Least : "+ grp.First());
Console.WriteLine("Most : "+ grp.Last());

答案 3 :(得分:0)

不止一个或最不常见的可能性很小:

var a = Enumerable.Repeat(new Random(), 100).Select(r => r.Next(6) + r.Next(6) + 2);

var groups = a.GroupBy(i => i).GroupBy(g => g.Count(), g => g.Key).OrderBy(g => g.Key).ToList();

var mostCommon = string.Join(", ", groups.Last());
var leastCommon = string.Join(", ", groups[0]);
相关问题