【问题标题】:How to fill a 2 dimensional array's row with random numbers from Enumerable.Range list c#如何用 Enumerable.Range 列表 c# 中的随机数填充二维数组行
【发布时间】:2015-06-25 10:46:42
【问题描述】:

我正在尝试用包含 45 个数字的 Enumerable.Range 列表中的 6 个随机数填充二维数组的每一行。每次在数组的特定行中输入 6 个数字时,它们就会从列表中删除。问题是数组的每一行都使用相同的列表,直到其中没有数字为止。如何重置每一行的列表?

这是我目前所拥有的:

    static void InitMatrix(int[,] mat)
{

    List<int> numbers = Enumerable.Range(1, 45).ToList();
    Random rnd = new Random();

    for (int i = 0; i < mat.GetLength(0); i++)
    {
        if(mat.GetLength(0)< mat.GetLength(1))

        for (int j = 0; j < mat.GetLength(1); j++)
        {
            int index = rnd.Next(0, numbers.Count );
            mat[i, j] = numbers[index];
            numbers.RemoveAt(index);
        }
    }
}

【问题讨论】:

  • 如果您想每次都重置列表,请在 for 循环中声明它。类似List&lt;int&gt; numbers = new List&lt;int&gt;;...numbers = Enumerable.Range(1, 45).ToList();
  • @Eminem 我想你已经明白了。将其发布为答案,我会给你 +1。
  • @TimS。我对这些人来说太慢了.. :)
  • 请注意,其中两个答案是不同的 - 即使if statement 为假,一个也会创建一个新列表,另一个则不会。
  • @Eminem 我将我的 List 声明放在 If 语句中,因为您只需要 If 语句的真实结果的列表。

标签: c# arrays enumerable


【解决方案1】:

您在 for 循环之外声明您的数字列表。这意味着它不会在每一行之后重新启动。

static void InitMatrix(int[,] mat) {
    Random rnd = new Random();

    for (int i = 0; i < mat.GetLength(0); i++)
    {
        if(mat.GetLength(0)< mat.GetLength(1))
        {
            List<int> numbers = Enumerable.Range(1, 45).ToList();
            for (int j = 0; j < mat.GetLength(1); j++)
            {
                int index = rnd.Next(0, numbers.Count );
                mat[i, j] = numbers[index];
                numbers.RemoveAt(index);
            }
        }
    }
}

代码未经测试,但应该可以工作。

【讨论】:

    【解决方案2】:

    将列表声明移动到第一个(行)循环下方。这样,每当循环移动到下一行时,如果您愿意,列表就会重新初始化/刷新......

    static void InitMatrix(int[,] mat)
    {
        Random rnd = new Random();
    
        for (int i = 0; i < mat.GetLength(0); i++)
        {
            List<int> numbers = Enumerable.Range(1, 45).ToList();
    
            if(mat.GetLength(0)< mat.GetLength(1))
            {
               for (int j = 0; j < mat.GetLength(1); j++)
               {
                   int index = rnd.Next(0, numbers.Count );
                   mat[i, j] = numbers[index];
                   numbers.RemoveAt(index);
               }
            }
        }
    }
    

    【讨论】:

    • 这里有一个语法错误,循环内的“if(mat...)”下面没有括号或任何东西。我知道它在原始代码中,但它不起作用也有。
    • @RonBeyer 这不是语法错误,而是格式错误。这里的if 语句适用于for 语句。 IE。 for 块仅在 mat.GetLength(0) &lt; mat.GetLength(1) 时运行。
    • @TimS。是的,你是对的,猜想我的大脑已经连接到代码很臭,任何超过一行的东西都属于括号。
    • 这么简单...谢谢 :) 我之前试过,只是我移动了“随机 rnd = new Random();”也在第一个循环内,每行给我相同的数字:(
    猜你喜欢
    • 2012-08-21
    • 2012-07-27
    • 1970-01-01
    • 2014-05-10
    • 2017-04-17
    • 2021-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多