配列のシャッフル

前回の記事で配列のユニークをやったので思いつきで今回は配列のシャッフルをやってみたいと思います。

#include <time.h>
#include "mylib.h"

void shuffle (int *num, int array_size) {
    int i,j;
    
    srand( (unsigned)time(NULL) );
    
    for(i=0;i<array_size;++i){
        j = rand() % array_size;
        swap(&num[i],&num[j]);
    }
}

int main (void) {
    int num[] = { 1,4,4,5,6,3,8,9,3,2,1,9,0,2};
    
    shuffle(num,ARRAY_NUM(num));
    printf_array("%d ",num,ARRAY_NUM(num));
    
    return 0;
}
$ main
3 4 1 6 9 3 2 2 9 1 0 5 8 4

$ main
5 8 3 1 4 9 9 4 2 1 3 0 2 6

$ main
9 8 4 5 2 1 2 3 3 1 6 9 4 0

mylib.h

できました。srandを何処でやろうか迷ったのですが、今回はshuffle内部でやることにしました。

多分外側でやる方が良さそうな気はします。今のままだと同じ秒の間にshuffleが再度呼び出されると同じランダムシードになるので微妙です。