大家好我有二维数组4 * 4。我必须用1到16(包括1和16)的数字随机填写。每个号码只能使用一次,并且应使用1-16之间的所有数字。我写了下面的代码,但由于某种原因我不知道数组中的某些项目没有填充!! 任何人都可以告诉我我做错了什么
public void generateRandState()
{
bool flag = false;
Random rnd = new Random();
int temp ;
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
temp = rnd.Next(1, 17);
Console.WriteLine(temp);
if (taken[temp] == false)
{
state[i, j] = temp;
taken[temp] = true;
}
else // for repeated rands
{
temp = rnd.Next(1, 17);
Console.WriteLine(temp);
while (!flag)
{
if (taken[temp] == false)
{
flag = true;
break;
}
else
temp = rnd.Next(1, 17);
Console.WriteLine(temp);
}
if (taken[temp] == false)
{
state[i, j] = temp;
taken[temp] = true;
}
}
}
}
}
答案 0 :(得分:4)
每个号码只能使用一次,并且应使用1-16之间的所有数字。
这称为随机随机播放。您可以使用Fisher–Yates shuffle来构建它。
This post为其提供了代码。
static Random _random = new Random();
public static void Shuffle<T>(T[] array) {
var random = _random;
for (int i = array.Length; i > 1; i--) {
int j = random.Next(i); // 0 <= j <= i-1
T tmp = array[j];
array[j] = array[i - 1];
array[i - 1] = tmp;
}
}
答案 1 :(得分:1)
将while (!flag)
替换为while (true)
。 break
已经让您退出while
声明。 flag
变量完全没必要。
你的算法非常低效。正如dasblinkenlight指出的那样,有更好的方法来完成你正在做的事情。
如果您多次拨打taken
,您还应该知道generateRandState
需要清除。