1.1.36

上次更新:2019-04-17
发现了题解错误/代码缺陷/排版问题?请点这里:如何:提交反馈

解答

N 取到 1000 左右数据就比较明显了。

N = 1000, M = 10

代码

static void Main(string[] args)
{
    int M = 10;//数组大小
    int N = 1000;//打乱次数
    int[] a = new int[10];

    int[,] result = new int[M, M];

    for (int i = 0; i < N; ++i)
    {
        //初始化
        for (int j = 0; j < a.Length; ++j)
        {
            a[j] = j;
        }

        //打乱
        Shuffle(a, i);

        //记录
        for (int j = 0; j < M; ++j)
        {
            result[a[j], j]++;
        }
    }

    PrintMatrix(result);
}

/// <summary>
/// 打乱数组
/// </summary>
/// <param name="a">需要打乱的数组</param>
/// <param name="seed">用于生成随机数的种子值</param>
static void Shuffle(int[] a, int seed)
{
    int N = a.Length;
    Random random = new Random(seed);
    for (int i = 0; i < N; ++i)
    {
        int r = i + random.Next(N - i);//等于StdRandom.uniform(N-i)
        int temp = a[i];
        a[i] = a[r];
        a[r] = temp;
    }
}

/// <summary>
/// 在控制台上输出矩阵
/// </summary>
/// <param name="a">需要输出的矩阵</param>
public static void PrintMatrix(int[,] a)
{
    for (int i = 0; i < a.GetLength(0); ++i)
    {
        for (int j = 0; j < a.GetLength(1); ++j)
        {
            Console.Write($"\t{a[i,j]}");
        }
        Console.Write("\n");
    }
}
上一题 下一题