Code:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdbool.h>
#include <string.h>
#define ARR_SIZE 10
void set_seed() {
srand(time(NULL));
}
void shuffle(void * ptr, unsigned int elem_size, size_t size) {
static bool set_seed_called = false;
size_t counter = size - 1;
char temp[elem_size];
if (!set_seed_called) {
set_seed();
set_seed_called = true;
}
for (int i = 0; i < size; ++i) {
int pos = rand() % (counter + 1);
memcpy(temp, ((char*)ptr) + (elem_size * counter), elem_size);
memcpy(((char*)ptr) + (elem_size * counter), ((char*)ptr) + (elem_size * pos), elem_size);
memcpy(((char*)ptr) + (elem_size * pos), temp, elem_size);
--counter;
}
}
int main(int argc, char ** argv) {
int i_arr[ARR_SIZE] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
for (int i = 0; i < ARR_SIZE; ++i) {
fprintf(stdout, "%d, ", i_arr[i]);
}
fputs("\n", stdout);
shuffle(i_arr, sizeof(*i_arr), ARR_SIZE);
for (int i = 0; i < ARR_SIZE; ++i) {
fprintf(stdout, "%d, ", i_arr[i]);
}
fputs("\n", stdout);
char* s_arr[ARR_SIZE] = {
"aaaaa",
"bbbbb",
"ccccc",
"ddddd",
"eeeee",
"fffff",
"ggggg",
"hhhhh",
"iiiii",
"jjjjj"
};
for (int i = 0; i < ARR_SIZE; ++i) {
fprintf(stdout, "%s, ", s_arr[i]);
}
fputs("\n", stdout);
shuffle(s_arr, sizeof(*s_arr), ARR_SIZE);
for (int i = 0; i < ARR_SIZE; ++i) {
fprintf(stdout, "%s, ", s_arr[i]);
}
fputs("\n", stdout);
return 0;
}
Note: The shuffle functions works but I'd like to know if the casting is proper.