我正在开展一个学校项目,我需要创建一个数组(大小为30) 随机唯一数字在1到70之间。
我设法找到了如何创建随机唯一数字的数组,但不是在1到70之间。
public int[] ShuffleArray(int[] arr)
{
Random rand = new Random();
int[] array = new int[70];
for (int i = 0; i < 70; i++)
array[i] = i + 1;
int[] MyRandomArray = array.OrderBy(x => rand.Next(1, 71)).ToArray();
for (int k = 0; k < arr.Length; k++)
arr[k] = MyRandomArray[k];
return arr;
}
我根据反馈更改了它,但它仍然无法正常工作。
答案 0 :(得分:2)
这三个步骤是:
看起来你有1和2覆盖所以目前你有70个数字,按随机顺序。剩下的是第3步,第30步。
您可以使用Take
来实现它。它会返回IEnumerable
,因此您可以使用ToArray
将其转换为数组。
return MyRandomArray.Take(30).ToArray();
所以使用你的代码,它看起来像这样:
public int[] ShuffleArray(int[] arr)
{
Random rand = new Random();
int i;
int[] array = new int[70];
for (i = 0; i < 70; i++)
array[i] = i + 1;
int[] MyRandomArray = array.OrderBy(x => rand.Next()).ToArray();
return MyRandomArray.Take(30).ToArray();
}
虽然我们在这里,但我们也要修复一些事情。
您可以在for循环中加入i
的声明和使用:
for (int i = 0; i < 70; i++)
在C#中,惯例是使用camelCase编写变量,因此MyRandomArray
应命名为myRandomArray
。
您可以使用以下内容缩写for
循环:
int[] array = Enumerable.Range(1,70).ToArray();
最后,如果你想真正优化事物,你可以在一行中加入OrderBy
和Take
的声明来删除临时变量:
public int[] ShuffleArray(int[] arr)
{
Random rand = new Random();
return Enumerable.Range(1, 70).OrderBy(x => rand.Next()).Take(30).ToArray();
}