[C言語]あみだくじを作りたい

C言語であみだくじを作りたい

配列0〜8に数字1〜9が入っているとする
(1, 2, 3, 4, 5, 6, 7, 8, 9)

横線が入ると、数字の値が入れ替わる
(2, 3) -> (3, 2)
(8, 9) -> (9, 8)

最終的に
(1, 3, 2, 4, 5, 6, 7, 9, 8)

図で書くとこんな感じか

これをプログラミングで書きたい

1回交換するだけなら

#include 
#include 
#include 

int main(){
	int a[] = {0, 1, 2, 3, 4, 5, 6, 7, 8};
	int i, num1, num2, tmp;

	srand((unsigned int)time(NULL));
	num1 = rand() % 9;
	if(num1 == 8){
		num1 = 7;
	}
	num2 = num1 + 1;

	tmp = a[num1];
	a[num1] = a[num2];
	a[num2] = tmp;
	
	
	for(i=0; i<9; i++){
		printf("%d ",a[i]);
	}
	printf("\n");

	return 0;
}

$ gcc -o main main.c
$ ./main
0 1 2 4 3 5 6 7 8
$ ./main
0 1 2 3 5 4 6 7 8

これを複数回変更したい

#include 
#include 
#include 

int main(){
	static int a[] = {0, 1, 2, 3, 4, 5, 6, 7, 8};
	int i, j, num1, num2, tmp;
	srand((unsigned int)time(NULL));

	for(i=0; i<3; i++){
		num1 = rand() % 9;
		if(num1 == 8){
			num1 = 7;
		}
		num2 = num1 + 1;
		printf("%d回目に変更したのは%d番目と%d番目\n", i+1, num1+1, num2+1);

		tmp = a[num1];
		a[num1] = a[num2];
		a[num2] = tmp;
	}
		
	for(j=0; j<9; j++){
		printf("%d ",a[j]);
	}
	printf("\n");

	return 0;
}

$ ./main
1回目に変更したのは3番目と4番目
2回目に変更したのは4番目と5番目
3回目に変更したのは8番目と9番目
0 1 3 4 2 5 6 8 7
$ ./main
1回目に変更したのは7番目と8番目
2回目に変更したのは6番目と7番目
3回目に変更したのは5番目と6番目
0 1 2 3 7 4 5 6 8

いいねー、3時間ぐらいかかったけど