我用 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/