如何创建数组的随机排列?

我在C中编写了这个函数,我想让它创建一个随机排列或从1到n的数字列表。 我无法让它没有重复的数字。 所以,如果你有n = 4,我希望它只返回一个包含1-4的随机数组,例如:{1,3,4,2}

int* random(int n) { int* r = malloc(n * sizeof(int)); // initial range of numbers for(int i=0;i<n;++i){ r[i]=i+1; } // shuffle for (int i = 1; i <= n; ++i){ int j = rand() % i; r[i] = r[j]; r[j] = i; } return r; } 

将您的第二个for循环更改为:

 for (int i = n-1; i >= 0; --i){ //generate a random number [0, n-1] int j = rand() % (i+1); //swap the last element with element at random index int temp = r[i]; r[i] = r[j]; r[j] = temp; } 

这是Fisher-Yates改组算法。 我听说使用rand() % n不均匀分布,你已经被警告了。

如果您希望每次都生成唯一的排列,您可以存储生成的排列,可能存储在DictionaryHashmap ,然后在每次返回时进行查找。 我不认为C有一个内置的,但应该有可用的库。

它可能不是最有效的方法,但由于你已经在开始时填充数组,你可以只循环遍历元素,并为每个元素选择1到n范围内的随机索引,并交换那个项目:

 int* random(int n) { int* r = malloc(n * sizeof(int)); for(int i=0;i 

我不知道这是否是最有效的,或者即使它给出了最好的分布。 但这很简单:-)