我有一个像这样的数组:
int[] numbers = new [] { 1, 2, 3, 4 };
我想随机化这个(每次都不同),这样它就可以制作另一个数组,每个数组的大小和数量相同但每次都有不同的顺序。
答案 0 :(得分:17)
尝试这样的事情:
System.Random rnd = new System.Random();
var numbers = Enumerable.Range(1, 4).OrderBy(r => rnd.Next()).ToArray();
答案 1 :(得分:4)
这是一种可行的方法:
public List<int> Randomize(int[] numbers)
{
List<int> randomized = new List<int>();
List<int> original = new List<int>(numbers);
Random r = new Random();
while (original.Count > 0) {
int index = r.Next(original.Count);
randomized.Add(original[index]);
original.RemoveAt(index);
}
return randomized;
}
修改强>
另一种方法是使用IEnumerable<T>
集合的LINQ扩展方法:
var random = new Random();
List<int> randomized = numbers.OrderBy(x => random.Next()).ToList();
如果您想要一个数组而不是List<int>
,则可以调用.ToArray()
。
当然,这适用于int
的任何数组,不仅适用于1, 2, 3, ..., n
。您甚至可以在T
中将该方法设为通用。
答案 2 :(得分:2)
public static void Shuffle<T>(T[] array)
{
Random random = new Random();
for (int i = 0; i < 10; i++)
{
int idx = random.Next(i, 10);
//swap elements
T tmp = array[i];
array[i] = array[idx];
array[idx] = tmp;
}
}
答案 3 :(得分:0)
这甚至会使值不重复;
for(int i=0;i<4;i++)
{
int no_repeat = -1;
int x,j;
while(no_repeat!=1)
{
x=rand()%4;
for(j=0;j<4;j++)
{
if(numbers[j]==x)
break;
}
if(j==4)
no_repeat=1;
}
if(no_repeat)
numbers[i]=x;
}
答案 4 :(得分:0)
在我看来,最简单的方法是:
int[] grid = new int[9];//size of array
Random randomNumber = new Random();//new random number
var rowLength = grid.GetLength(0);
var colLength = grid.GetLength(1);
for (int row = 0; row < rowLength; row++)
{
grid[col] = randomNumber.Next(4)+1;//Fills grid with numbers from
//1-4
Console.Write(String.Format("{0}\t", grid[col]));
//Displays array in console
Console.WriteLine();
}
答案 5 :(得分:-2)
有效:
numbers = numbers.OrderBy(s => Guid.NewGuid()).ToArray();