Skip to content

Instantly share code, notes, and snippets.

@ww24
Last active January 2, 2016 11:09
Show Gist options
  • Save ww24/8294315 to your computer and use it in GitHub Desktop.
Save ww24/8294315 to your computer and use it in GitHub Desktop.
あらゆる型の配列をシャッフルする関数
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// 配列シャッフル
void shuffle(void*, size_t, size_t);
// funcs
char _a(void) {return 'A';}
char _b(void) {return 'B';}
char _c(void) {return 'C';}
char _d(void) {return 'D';}
char _e(void) {return 'E';}
char _f(void) {return 'F';}
char _g(void) {return 'G';}
char _h(void) {return 'H';}
char _i(void) {return 'I';}
char _j(void) {return 'J';}
int main(void)
{
int i;
int nums[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
char strs[][7] = {"apple", "banana", "citron", "grape", "lemon", "mango", "melon", "orange", "peach", "pear"};
char (*funcs[])(void) = {_a, _b, _c, _d, _e, _f, _g, _h, _i, _j};
// 乱数シード設定
srand((unsigned)time(NULL));
// int 型配列
shuffle(nums, sizeof(nums) / sizeof(*nums), sizeof(*nums));
for (i = 0; i < sizeof(nums) / sizeof(*nums); i++)
printf("%d\n", nums[i]);
// char 型 2 次元配列
shuffle(strs, sizeof(strs) / sizeof(*strs), sizeof(*strs));
for (i = 0; i < sizeof(strs) / sizeof(*strs); i++)
printf("%s\n", strs[i]);
// 関数ポインタ配列
shuffle(funcs, sizeof(funcs) / sizeof(*funcs), sizeof(*funcs));
for (i = 0; i < sizeof(funcs) / sizeof(*funcs); i++)
putchar(funcs[i]());
puts("");
return 0;
}
// 配列シャッフル
void shuffle(void *arr, size_t arr_len, size_t elem_size)
{
char *a = (char *)arr, *b;
size_t i, j;
for (i = 0; i < arr_len; i++) {
// ランダムに要素を決定
b = (char *)arr + (rand() % arr_len) * elem_size;
// 入れ替え判定
if (a != b) {
// 1 byte ずつ入れ替え
for (j = 0; j < elem_size; j++) {
*a ^= *b;
*b ^= *a;
*(a++) ^= *(b++);
}
} else {
a += elem_size;
}
}
}
@ww24
Copy link
Author

ww24 commented Jan 7, 2014

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment