表演费舍尔-耶茨直接在2D阵列中洗牌

时间:2018-11-15 23:25:59

标签: c arrays algorithm random shuffle

我一直在尝试对2D数组的前N个元素直接执行部分费舍尔式的随机操作,但没有成功。我知道我可以将2D数组转换为1D数组,执行随机播放然后再将其返回,但是如果可能的话,我想避免这种情况。

我的实现中的问题是,尽管我尚未证明,但我认为数组的每一行的最后元素没有正确地改组。实际上,假设我有一个m*n数组,其中第一个N等于1,其余m*n - N等于0。当我执行第一个{{1 }}数组中的元素,大约占每一行末尾N元素的1等于67%的时间。

这是我的实现以及可以显示问题所在的驱动程序代码:

array[i][end]

我知道它看起来不太好,并且必须有一种更有效的方法。也许有一种不同的,同样有效的算法可以像这样洗牌2D数组的前N个元素?

1 个答案:

答案 0 :(得分:3)

扩展我之前的评论,您可以在一个循环中随机排列“数组”:

void fisher_yates_shuffle(int n, int nbLines, int nbColumns, int **a) 
{
    for (int i = 0; i < n; i++)
    {
        int j = i + rand() % (nbLines * nbColumns - i);
        swap(a, i / nbColumns, i % nbColumns, j / nbColumns, j % nbColumns); 
    }
}

请注意,有更好的方法可以在C中实现和传递矩阵,并且交换功能应返回void,而不是int