我有一个初始化的数组:
int[] myArray = new int[] {9, 8, 7, 3, 4, 5, 6, 2, 1};
然后我有一个for()循环,每次使用:
搜索数组中的最高值int maxValue = myArray.Max();
int maxIndex = myArray.ToList().IndexOf(maxValue);
显然,它仍然认为9是最高值。
我希望它首先将先前索引的值设置为低于当前maxValue但高于-1的随机值,并继续在数组中搜索下一个maxValue并将其打印到控制台。
(如果所有值达到值== 0则模拟停止)< - 这部分我知道该怎么做。
这可能吗?如果是这样,怎么样?
答案 0 :(得分:1)
我想这可能是你想要的。让我知道它对你有用。
using System;
using System.Linq;
public class Program
{
private static Random random = new Random();
public static void Main()
{
int[] myArray = new int[] {9, 8, 7, 3, 4, 5, 6, 2, 1};
Simulate(myArray);
}
static void Simulate(int[] myArray)
{
int maxValue = myArray.Max();
Console.WriteLine(string.Join(" ",myArray));
var continueSimulation = true;
do{
int maxIndex = myArray.ToList().IndexOf(maxValue);
var randomValue = random.Next(0, maxValue);
myArray[maxIndex] = randomValue;
maxValue = myArray.Max();
if (maxValue == 0)
continueSimulation = false;
Console.WriteLine(string.Join(" ",myArray));
}while(continueSimulation);
}
}
您可以在this小提琴上查看。
希望这有帮助!
答案 1 :(得分:0)
如果要查找第二个最大值,可以标记第一个最大值的位置,然后继续使用相同的方法。怎么办? 1-初始化一个bool数组,其数组长度与你想要找到max的数组相同,然后找到第一个max并在第二个数组中用true标记该位置,如果你想要第二个max,则循环通过要求最大值的数组以及该元素是否未在第二个bool数组中标记。最后你将得到第二个最大值。 另一个想法是在列表中获取值,一旦找到最大值,从列表中删除max以继续使用相同的算法,但使用较少值的数组
static int Max(int [] num)
{
int max = num[0];
for(int i = 0; i < num.Length; i ++)
{
if(num[i] > max)
max = num[i];
}
return max;
}
static int SecondMax(int[]a)
{
if(a.Length < 2) throw new Exception("....");
int count = 0;
int max = Max(a);
int[]b = new int[a.Length];
for(int i = 0; i < a.Length; i ++)
{
if(a[i] == max && count == 0)
{
b[i] = int.MinValue;
count ++;
}
else b[i] = a[i];
}
return Max(b);
}
答案 2 :(得分:0)
老实说,这个问题有点不寻常,所以如果你分享为什么要尝试这样做,也许有人会提出更好的方法。但是,要回答原始问题,您可以使用.NET的随机数生成器。
int[] myArray = new int[] { 9, 8, 7, 3, 4, 5, 6, 2, 1 };
Random random = new Random();
for (int max = myArray.Max(); max > 0; max = myArray.Max())
{
int index = myArray.IndexOf(max);
DoSomething(max);
myArray[index] = random.Next(0, max);
}
从MSDN doco on Random开始,上限是独占的,这意味着它将生成0到max-1之间的随机数,除非max == 0,在这种情况下它将返回0。