如何创建一个数组的随机排列? [英] How to create a random permutation of an array?
问题描述
我用C编写的这个功能,我想它来创建一个随机排列或数字从1到n的列表。我无法得到它没有重复号码。所以,如果你有N = 4,我想它返回一个包含各1-4只进行一次随机序列,例如:{1,3,4,2}
为int *随机(INT N)
{
为int * R =的malloc(N * sizeof的(INT));
//号的初始范围
的for(int i = 0; I< N ++我){
- [R [i] = I + 1;
}
//洗牌
的for(int i = 1; I< = N; ++ I){
INT J =兰特()%I;
- [R [i] = R [J]。
- [R [J] =我;
}
返回ř;
}
更改您的第二个为
循环:
的for(int i = N-1; I> = 0; --i){
//生成一个随机数[0,N-1]
INT J =兰特()%(I + 1); //交换最后一个元素与元素随机指数
INT温度= R [I]
- [R [i] = R [J]。
- [R [J] =温度;
}
这是一个费雪耶茨洗牌算法。我一直在使用听说兰特()%N
不均匀分布,你已经被警告。
如果你想每次生成唯一的排列,可以存储生成的排列,可能在词典
或的Hashmap
,然后查找每次你回来。我不认为 C
有一个内置的之一,但应该有可用的库。
I've written this function in C and I want it to create a random permutation or a list of numbers from 1 to n. I'm having trouble getting it to have no repeating numbers. So if you have n = 4, i would like it to return a random array containing 1-4 each only once, for example: {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;
}
Change your second for
loop to:
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;
}
This is a Fisher-Yates shuffling algorithm. I have heard using rand() % n
doesn't distribute uniformly, you've been warned.
And if you want to generate unique permutations everytime, you can store the generated permutations, maybe in a Dictionary
or Hashmap
, and then lookup everytime you return. I don't think C
has a built in one but there should be libraries available.
这篇关于如何创建一个数组的随机排列?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!