[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

あなたの作った歌をソフトウェアが人間の声で歌う! これぞ近未来のソフトウェア!
これを流行の一言ですませてはいけない! 技術的にもコンセプト的にも凄い!