トップアルゴリズム > シャッフル(配列の要素をランダムに並び替える)

シャッフル(配列の要素をランダムに並び替える)

シャッフル

Fisher-Yatesシャッフルアルゴルズムによりint型配列を並べ変えるプログラムを下に示す。

[shuffle.c]
#include <stdio.h>
#include <stdlib.h>

void shuffle(int array[], int size) {
    for(int i = 0; i < size; i++) {
        int j = rand()%size;
        int t = array[i];
        array[i] = array[j];
        array[j] = t;
    }
}

int main(void){
    int list[10] = {0,1,2,3,4,5,6,7,8,9};

    shuffle(list, 10);
    for (int i = 0; i < 10; i++) {
        printf("%d,", list[i]);
    }
    return 0;
}

このプログラムをコンパイル・実行した結果を下に示す。

c:\gisa>gcc \_www\algorithm\src\shuffle.c

c:\gisa>a
3,7,0,1,2,9,8,6,4,5,

乱数発生(rand関数)について[2]

rand関数は 0~RAND_MAX までの整数の乱数(疑似乱数)を発生させる。

上のプログラムでは発生する乱数列は毎回同じである。 乱数列を変えるには、srand関数を使って初期化する。 srand((unsigned int)time(NULL)); とすれば、現在時刻により初期化されるため、 毎回、実行結果が異なる。

参考文献

[1] 【C言語/C++】配列をシャッフルしてランダムに入れ替える
[2] 【C言語入門】乱数(rand)の使い方