[PR]

配列をランダムに並べ替える

戻る

 配列をランダムに並べ替える関数を作る。

//*********************************************************
//   配列をランダムに並べ替える
//*********************************************************
void random_shuffle( void *array, size_t num, size_t size )
{
	char *start = (char *)array;
	{for( size_t i = 1; i < num; ++i )
	{
		const size_t x = rand() % (i+1);
		if ( x != i )
		{
			memswap( start + (i*size), start + (x*size), size );
		}
	}}
}//random_shuffle

使用例

/* 関数 random_shuffle() の使用例です。 */
int main( void )
{
#define init_array(a,n) {for(int k=0;k<n;++k){a[k]=(short)k;}}
#define print_array(a,n) {for(int k=0;k<n;++k){printf("%d, ",a[k]);}puts("");}
	short array[10];
	int   test_num[] = { 2, 3, numof(array), 0 };

	srand(time(NULL));
	init_array( array, 1 );
	random_shuffle( array, 1, sizeof(short) );
	print_array( array, 1 );
	{for( int *p = test_num; 0 != *p; ++p )
	{
		init_array( array, *p );
		print_array( array, *p );
		{for( int j = 0; j < 5; ++j )
		{
			init_array( array, *p );
			random_shuffle( array, *p, sizeof(short) );
			print_array( array, *p );
		}}
	}}
	return 0;
#undef init_array // #define init_array(a,n)
#undef print_array // #define print_array(a,n)
}//main

実行結果

0,
0, 1,
1, 0,
0, 1,
0, 1,
1, 0,
0, 1,
0, 1, 2,
1, 2, 0,
0, 1, 2,
2, 0, 1,
2, 0, 1,
1, 2, 0,
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
0, 6, 9, 1, 4, 3, 5, 7, 2, 8,
8, 3, 7, 5, 1, 4, 9, 2, 0, 6,
2, 1, 6, 8, 5, 4, 0, 9, 7, 3,
2, 8, 7, 5, 4, 9, 6, 1, 3, 0,
4, 0, 5, 1, 2, 6, 8, 7, 3, 9,

関連

配列の要素を逆順に並べ替える
配列の要素を回転移動する
整列済み配列から重複する要素を取り除く
配列が整列されているかどうか調べる
配列から要素を検索する



Google
ご意見・ご感想をお聞かせ下さい。匿名で送信できます。

 * 返信が必要な場合には postmaster@katsura-kotonoha.sakura.ne.jp へ直接メールしてください。

水無瀬 優 postmaster@katsura-kotonoha.sakura.ne.jp

>> 扉の外 I / II / III