生成1到16之间的随机数

时间:2014-04-12 11:00:06

标签: c# random

大家好我有二维数组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;

                    }

                }

            }
        }
    }

2 个答案:

答案 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需要清除。