在一定的范围内随机生成一个唯一的数字数组

本文关键字:一个 唯一 数字 数组 范围内 随机 | 更新日期: 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;
}

我根据反馈更改了它,但它仍然不起作用。

在一定的范围内随机生成一个唯一的数字数组

三个步骤是:

  1. 生成所有选项
  2. 打乱顺序
  3. 取前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();

最后,如果您想真正优化,您可以将该声明与OrderByTake连接在一行中,以删除临时变量:

public int[] ShuffleArray(int[] arr)
{
    Random rand = new Random();
    return Enumerable.Range(1, 70).OrderBy(x => rand.Next()).Take(30).ToArray();
}