C# 调试时工作,运行时失败?

C# 调试时工作,运行时失败?,c#,arrays,debugging,random,2d,C#,Arrays,Debugging,Random,2d,对于一些课程,我需要通过蛮力生成一个普通的幻方,这是代码的一部分。供参考;除了常用的类之外,我不允许使用任何类。(我可能在数学方面碰运气了。Pow) 我使用以下方法生成尺寸为NxN的二维图形: static int[,] GenerateSquare(int n) { int[,] sqarray = new int[n,n]; int[] rndarray = new int[n]; //puts completely rand

对于一些课程,我需要通过蛮力生成一个普通的幻方,这是代码的一部分。供参考;除了常用的类之外,我不允许使用任何类。(我可能在数学方面碰运气了。Pow)

我使用以下方法生成尺寸为NxN的二维图形:

    static int[,] GenerateSquare(int n)
    {
        int[,] sqarray = new int[n,n];
        int[] rndarray = new int[n];

        //puts completely random integers from 1 to n^2 in all elements of the square array (sqarray)
        for (int i = 0; i < n; i++)
        {
            rndarray = FullRndArray(n);

            for (int j = 0; j < n; j++)
            {
                sqarray[i, j] = rndarray[j];
            }
        }

        return sqarray;
    }
static int[,]生成正方形(int n)
{
int[,]sqarray=新的int[n,n];
int[]rndarray=新的int[n];
//将从1到n^2的完全随机整数放入方形数组(sqarray)的所有元素中
对于(int i=0;i
FullRndArray()方法如下所示:

static int[] FullRndArray(int n)
    {
        //creates an array of size n and fills with random intigers between 1 and n^2
        int[] rndarray = new int[n];
        Random rnd = new Random();

        int ntothe2 = Convert.ToInt32(Math.Pow(n, 2));

        for (int i = 0; i < n; i++)
            rndarray[i] = rnd.Next(1, ntothe2 + 1);

        return rndarray;
    }
static int[]FullRndArray(int n)
{
//创建大小为n的数组,并使用介于1和n^2之间的随机整数填充
int[]rndarray=新的int[n];
随机rnd=新随机();
intntothe2=Convert.ToInt32(Math.Pow(n,2));
对于(int i=0;i
问题是,当我运行这段代码时,每一行的内容都是随机的,但正方形的每一行都与最后一行相同(即1-1、1-2、1-3分别与2-1、2-2、2-3和3-1、3-2、3-3相同)。然而,当我逐行通过调试器时,我在每个空间都会得到一组完全随机的数字。谁能给我解释一下这个错误吗?

这就是罪魁祸首:

Random rnd = new Random();
随机数是从一个种子开始生成的:相同的种子意味着相同的随机数序列
Random
使用当前时间作为种子,因此当您运行代码时,它运行得非常快,以至于您正在使用相同的种子创建两个
Random
s,然后生成两个相同的行。另一方面,当你调试时,你让足够的时间过去,一切都按预期进行。

解决方案是创建一个
随机
、静态或在
生成方
开始时的实例,并在整个过程中使用该实例。

我得到了与您描述的完全相同的行为

这似乎有效:

static int[,] GenerateSquare(int n)
{
    int[,] sqarray = new int[n, n];
    int[] rndarray = new int[n];

    Random rnd = new Random();
    //puts completely random integers from 1 to n^2 in all elements of the square array (sqarray)
    for (int i = 0; i < n; i++)
    {
        rndarray = FullRndArray(n, rnd);
        for (int j = 0; j < n; j++)
        {
            sqarray[i, j] = rndarray[j];
        }
    }

    return sqarray;
}
static int[] FullRndArray(int n, Random rnd)
{
    //creates an array of size n and fills with random intigers between 1 and n^2
    int[] rndarray = new int[n];

    int ntothe2 = Convert.ToInt32(Math.Pow(n, 2));

    for (int i = 0; i < n; i++)
        rndarray[i] = rnd.Next(1, ntothe2 + 1);

    return rndarray;
}
static int[,]生成正方形(int n)
{
int[,]sqarray=新的int[n,n];
int[]rndarray=新的int[n];
随机rnd=新随机();
//将从1到n^2的完全随机整数放入方形数组(sqarray)的所有元素中
对于(int i=0;i
我知道我们必须在同一个实例上使用
Random.Next()
方法才能“真正”随机(如黑耳答案中所述)


它可能在调试期间起作用,因为您在两个步骤之间产生了时间间隔。

您可以通过使用
n*n
来消除
Math.Pow
。一般来说,您可以使用
(int)
而不是
Convert.Int32
,除非您需要舍入。非常感谢您的解释!)现在差不多可以正常工作了谢谢你的示例修复:)