c - 将给定列表中的所有数字以随机顺序分配到二维数组中

标签 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]);

    }
}

}

最佳答案

请注意,与说“这些数字是随机的”相比,说“这些数字都是不同的”会立即使它们不那么随机。您似乎觉得重复会使数字集合作为一个整体的随机性降低,这是不正确的。

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

以下是一个交换的实现方式:

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;
}

这是非常基础的。

关于c - 将给定列表中的所有数字以随机顺序分配到二维数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33191571/

相关文章:

c# - 如何使用 LINQ 将数组转换为字典

arrays - 闭包数组简写 : Xcode Swift: Expression too complex to be solved in a reasonable time

c - 在 C 中定义 16 位整数

C 预处理器测试多个宏的定义

C unsigned long long 误算

javascript - 防止在数组中添加相同的随机值

java - 需要帮助在处理中将整数数组添加到数组列表

C、函数的变量在完成后会发生什么?

c - 开发 GUI 并加载引导加载程序库

c - 在 C 中的结构数组中获取唯一输入