[ create a new paste ] login | about

Link: http://codepad.org/YKghtbYD    [ raw code | output | fork ]

C, pasted on Oct 21:
#include <stdio.h>
#include <stdlib.h>

static void swap(int* a, int* b)
{
	int tmp = *a;
	*a = *b;
	*b = tmp;
}

void shuffle_array(int* a, size_t N, int entropy)
{
	int i=entropy;
	while(i-->0) {
		int* p0 = &a[rand() % N];
		int* p1 = &a[rand() % N];
		swap(p0, p1);
	}
}

static void test_init_array(int* a, size_t N)
{
	int i=0;
	while(i < N) {
		*a++ = i++;
	}
}

static void test_print_array(int* a, size_t N)
{
	int i;
	for(i = 0; i < N; i++) {
		if((i % 10 == 0) && (i > 0)){
			printf("\n");
		}

		printf("%3d ", *a++);
	}

	printf("\n");
}

static unsigned long long rdtsc(void)
{
	unsigned long long tmp;
	__asm__ volatile("rdtsc;":"=A"(tmp));
	return tmp;
}

main()
{
	void test(int* P, size_t N, int entropy)
	{
		printf("%d回、位置の交換をした状態\n", entropy);
		shuffle_array(P, N, entropy);
		test_print_array(P, N);
	}

	srand(rdtsc());
	const int N = 136;
	int P[N];

	test_init_array(P, N);
	test(P, N, 0);
	printf("\n\n");

	test_init_array(P, N);
	test(P, N, 10);
	printf("\n\n");

	test_init_array(P, N);
	test(P, N, 100);
	printf("\n\n");
	
	return 0;
}


Output:
0回、位置の交換をした状態
  0   1   2   3   4   5   6   7   8   9 
 10  11  12  13  14  15  16  17  18  19 
 20  21  22  23  24  25  26  27  28  29 
 30  31  32  33  34  35  36  37  38  39 
 40  41  42  43  44  45  46  47  48  49 
 50  51  52  53  54  55  56  57  58  59 
 60  61  62  63  64  65  66  67  68  69 
 70  71  72  73  74  75  76  77  78  79 
 80  81  82  83  84  85  86  87  88  89 
 90  91  92  93  94  95  96  97  98  99 
100 101 102 103 104 105 106 107 108 109 
110 111 112 113 114 115 116 117 118 119 
120 121 122 123 124 125 126 127 128 129 
130 131 132 133 134 135 


10回、位置の交換をした状態
105   1   2   3   4  20   6   7   8   9 
 10  11  12  13  48  15  16  17  18  19 
  5  21  22  23  24  25  26  27  28  29 
 30  31  32  33  34  35  36  37  99  39 
 40  41  42  73  44  93  46  47  14  49 
 77  51  52  53  54  55  56  57  58 127 
 60  61  62  63  64  65  66  38  68  69 
 70  71  72  43  74  75  76  50  78  79 
 80  81  82  83  84  85  86  87  88  89 
 90  91  92  45  94  95  96  97 119  67 
100 101 102 103 104   0 106 107 108 109 
110 111 112 113 114 115 116 117 118  98 
120 121 122 123 124 125 126  59 128 129 
130 131 132 133 134 135 


100回、位置の交換をした状態
127 113  73  92 108 118 126  47  67  28 
 10 121  38   6  24  85  16  17  18  80 
 20  21  22  30   0   8 104  45 102  19 
 23  54 117  33 116  81 114  37  39  76 
119  41 111  43  98   1  95 125  69   9 
 50  94  35  53  31  26 106  57  58  59 
  2  61  65  63  84  89  66 134  62   4 
 68  90  15  86  74  82  12  77  78 103 
  7  55  46  72 120  87  96 115  42 133 
 32  29   3  93 122  14  60  97  13  99 
 71  49  56  51 100 105  52 124  48 123 
 88 129 112 101  36  27  34 109  44  40 
135  91  75  70 107  11  25 110 128  79 
130 131 132   5  83  64 




Create a new paste based on this one


Comments: