在一定的范围内随机生成一个唯一的数字数组
本文关键字:一个 唯一 数字 数组 范围内 随机 | 更新日期: 2023-09-27 18:28:44
我正在做一个学校项目,需要创建一个数组(大小为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;
}
我根据反馈更改了它,但它仍然不起作用。
三个步骤是:
- 生成所有选项
- 打乱顺序
- 取前30
看起来你涵盖了1和2,所以目前你有70个数字,按随机顺序排列。剩下的是第三步,取前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();
}