C# - 如何找到数组中最常见和最不常见的整数?
C# - How to find the most common and the least common integers in an array?
我被要求制作一个包含两个数组(每个骰子一个)的骰子程序,并将两个结果相加,例如:2(骰子 1)+ 6(骰子 2)= 8。
程序必须掷骰子 100 次并显示每次的总和。
到目前为止我可以做到,但程序还必须显示哪个总和出现频率最高,哪个总和出现频率最低。
像这样:总和 = [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();
}
如果您有掷骰子 100 次的代码,那您就很接近了。你需要做的就是频率计数器。
一对骰子掷出一个介于 2 和 12 之间的数字,包括端值。在进入循环之前创建一个 int count[13]
数组。
在循环中,每次有两个数字时,比如 d1
和 d2
,按如下方式递增计数:
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 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();
存在不止一种最常见或最不常见的可能性很小:
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]);
我被要求制作一个包含两个数组(每个骰子一个)的骰子程序,并将两个结果相加,例如:2(骰子 1)+ 6(骰子 2)= 8。
程序必须掷骰子 100 次并显示每次的总和。 到目前为止我可以做到,但程序还必须显示哪个总和出现频率最高,哪个总和出现频率最低。
像这样:总和 = [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();
}
如果您有掷骰子 100 次的代码,那您就很接近了。你需要做的就是频率计数器。
一对骰子掷出一个介于 2 和 12 之间的数字,包括端值。在进入循环之前创建一个 int count[13]
数组。
在循环中,每次有两个数字时,比如 d1
和 d2
,按如下方式递增计数:
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 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();
存在不止一种最常见或最不常见的可能性很小:
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]);