1.1.37

1.1.37 #

解答 #

使用 0~N-1 的随机数会导致每次交换的数字可能相同。

例如:

原数组: 1 2 3 4

第一次: 2 1 3 4

random = 1,第 0 个和第 1 个交换。

第二次: 1 2 3 4

random = 0,第 1 个和第 0 个交换。

代码 #

// 使用 0~N-1 的随机数会导致每次交换的数字可能相同
// 例如:
// 原数组: 1 2 3 4
// 第一次: 2 1 3 4 random = 1,第 0 个和第 1 个交换
// 第二次: 1 2 3 4 random = 0,第 1 个和第 0 个交换
const int m = 10; // 数组大小
const int n = 100000; // 打乱次数
var a = new int[10];

var result = new int[m, m];

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

    // 打乱
    Shuffle(a, i);

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

PrintMatrix(result);

static void Shuffle(int[] a, int seed)
{
    var n = a.Length;
    var random = new Random(seed);
    for (var i = 0; i < n; i++)
    {
        // int r = i + random.Next(N - i);
        var r = random.Next(n); // 返回的是 0 ~ N-1 之间的随机整数
        var temp = a[i];
        a[i] = a[r];
        a[r] = temp;
    }
}

static void PrintMatrix(int[,] a)
{
    for (var i = 0; i < a.GetLength(0); i++)
    {
        for (var j = 0; j < a.GetLength(1); j++)
        {
            Console.Write($"\t{a[i, j]}");
        }

        Console.WriteLine();
    }
}