我一直在尝试对2D数组的前N个元素直接执行部分费舍尔式的随机操作,但没有成功。我知道我可以将2D数组转换为1D数组,执行随机播放然后再将其返回,但是如果可能的话,我想避免这种情况。
我的实现中的问题是,尽管我尚未证明,但我认为数组的每一行的最后元素没有正确地改组。实际上,假设我有一个m*n
数组,其中第一个N
等于1,其余m*n - N
等于0。当我执行第一个{{1 }}数组中的元素,大约占每一行末尾N
元素的1等于67%的时间。
这是我的实现以及可以显示问题所在的驱动程序代码:
array[i][end]
我知道它看起来不太好,并且必须有一种更有效的方法。也许有一种不同的,同样有效的算法可以像这样洗牌2D数组的前N个元素?
答案 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
。