簡體   English   中英

C#-如何查找數組中最常見和最不常見的整數?

[英]C# - How to find the most common and the least common integers in an array?

我被要求制作一個帶有兩個數組的骰子程序(每個骰子一個),並添加兩個結果,例如: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();
    }

您快到了,您可以找到最不常見的一個:

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();

如果您有將骰子擲骰100次的代碼,您將非常接近。 您需要做的就是頻率計數器。

一卷骰子產生的數字介於2和12之間(含2和12)。 進入循環之前,請先創建一個int count[13]數組。

在循環中,每次有兩個數字,例如d1d2 ,按如下所示遞增計數:

count[d1+d2]++;

循環結束后,在索引2和12(含)之間找到數組中的最高和最低編號。 最高編號的索引將是最高滾動數的編號; 最低編號的索引將是滾動計數最低的編號。

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());

一個或多個最不常見的機會很小:

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]);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM