我在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]);
}
}
}
答案 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;
}
这是非常基本的。