对于某些课程,我需要通过蛮力生成一个普通的魔方,这是代码的一部分。仅供参考;我不允许使用除常用之外的任何类。 (我可能用Math.Pow推动我的运气)
我有以下方法来生成2维大小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;
}
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;
}
问题在于,当我运行此代码时,每行的内容是随机的,但正方形的每一行与最后一行相同(即1-1,1-2,1-3与分别为2-1,2-2,2-3和3-1,3-2,3-3)。然而,当我逐行浏览调试器时,我最终会在每个空间中得到一组完全随机的数字。有人可以向我解释这个错误吗?
答案 0 :(得分:5)
这是罪魁祸首:
Random rnd = new Random();
从种子开始生成随机数:相同的种子意味着数字的相同的非随机序列。 Random
使用当前时间作为种子,因此当您运行代码时,它运行得如此之快,以至于您创建了两个具有相同种子的Random
,然后生成两个相同的行。另一方面,在调试时,让足够的时间过去,一切都按预期进行
解决方案是创建Random
的实例,静态或GenerateSquare
的开头,并将其用于整个过程。
答案 1 :(得分:1)
我得到了与你描述的完全相同的行为。
这似乎有效:
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;
}
我知道我们必须在同一个实例上使用Random.Next()
方法才能“真正”随机(如BlackBear答案中所述)。
它可能在调试期间起作用,因为你在步骤之间产生了时间间隔。