我被要求制作一个带有两个阵列的骰子程序(每个骰子一个)并添加两个结果,例如: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();
}
答案 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]
数组。
在循环中,每次有两个数字,例如d1
和d2
时,按如下方式递增计数:
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]);