将所有数字以随机顺序分配给给定列表中的2D数组

时间:2015-10-17 21:05:24

标签: c arrays

我在c中编写了以下程序,以便以随机顺序将K个数分配到M * N(M =行,N =列)数组,其中K = MN ,这样每个单元格得到一个从0到MN的唯一编号。但有一个问题。我在重复单元格中得到了一些重复的数字。 我如何获得所有唯一的数字?

示例程序:#

 #include<stdio.h>
 #include<math.h>
 #include <time.h>
 #define row 5
 #define col 5
 int total=row*col;
 int A[row][col];


main()
{
    int i,j;
    srand(time(NULL));
    for(i=0;i<row;i++)
{
    for(j=0;j<col;j++)
    {
        A[i][j]=rand()%total+1;

    }
}

for(i=0;i<row;i++)
{
    for(j=0;j<col;j++)
    {
       printf("\nA[%d][%d]=%d",i,j,A[i][j]);

    }
}

}

1 个答案:

答案 0 :(得分:1)

请注意,说“这些数字都不同”会立即使他们更少随机而不是说“这些数字是随机的”。你似乎觉得重复使得数字集合整体上不那么随机,这是不正确的。

你似乎想要一种排列。实现这一目的的一种方法是进行随机混洗,即用唯一数字初始化矩阵,然后随机重复挑选两个单元并交换它们的内容。毫无疑问,当你做了“足够”的互换时,有各种各样的方法可以知道。

以下是如何实施一次互换:

void random_point(int *x, int *y)
{
  *x = rand() % col;
  *y = rand() % row;
}

void permute(void)
{
  int x1, y1, x2, y2;
  random_point(&x1, &y1);
  random_point(&x2, &y2);
  const int tmp = A[y1][x1];
  A[y1][x1] = A[y2][x2];
  A[y2][x2] = tmp;
}

这是非常基本的。