在一定范围内创建一组随机唯一数字

时间:2016-01-01 22:17:13

标签: c# arrays random

我正在开展一个学校项目,我需要创建一个数组(大小为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 个答案:

答案 0 :(得分:2)

这三个步骤是:

  1. 生成所有选择
  2. 随机播放
  3. 采取前30
  4. 看起来你有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();
    

    最后,如果你想真正优化事物,你可以在一行中加入OrderByTake的声明来删除临时变量:

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