#include #include //#define DEBUG int* V; int N; float P; int seed; int cmp(const void* a, const void* b); int main(int argc, char** argv) { int i, j; int temp; int a, b; int length_sum, length_square_sum; if ( argc <= 3 || sscanf(argv[1], " %d", &N) != 1 || sscanf(argv[2], " %f", &P) != 1 || sscanf(argv[3], " %d", &seed) != 1 ) { fprintf(stderr, "uso: %s N P seed\n", argv[0], N, P, seed); exit(1); } srand(seed); V = (int*) calloc (2 * N, sizeof(int)); /* Spostamento casuale */ for ( i = 0 ; i < 2 * N ; i++ ) V[i] = i; for ( i = 0 ; i < 2 * N ; i++ ) { for ( j = i ; (rand() * 1.0) / RAND_MAX < P ; j++ ) if ( j == 2 * N - 1 ) break; temp = V[i]; V[i] = V[j]; V[j] = temp; } /* Ordinamento elementi coppia */ for ( i = 0 ; i < N ; i++ ) if ( V[2 * i] > V[2 * i + 1] ) { temp = V[2 * i]; V[2 * i] = V[2 * i + 1]; V[2 * i + 1] = temp; } /* Ordinamento coppie */ qsort(V, N, 2 * sizeof(int), cmp); /* Stampa */ #ifdef DEBUG length_sum = 0; length_square_sum = 0; for ( i = 0 ; i < N ; i++ ) { length_sum += V[2 * i + 1] - V[2 * i]; length_square_sum += (V[2 * i + 1] - V[2 * i]) * (V[2 * i + 1] - V[2 * i]); fprintf(stderr, "%4d (%4d, %4d) |", i, V[2 * i], V[2 * i + 1]); for ( j = 0 ; j < 2 * N ; j++ ) if ( j < V[2 * i] || j > V[2 * i + 1] ) fprintf(stderr, " "); else fprintf(stderr, "*"); fprintf(stderr, "|\n"); } fprintf(stderr, "Lunghezza media: %f\n", (length_sum * 1.0) / N); fprintf(stderr, "Varianza: %f\n", (length_square_sum * 1.0) / N - ((length_sum * 1.0) / N) * ((length_sum * 1.0) / N)); #endif printf("%d\n", N); for ( i = 0 ; i < N ; i++ ) printf("%d %d\n", V[2 * i], V[2 * i + 1]); return 0; } int cmp(const void* a, const void* b) { int* A = (int*) a; int* B = (int*) b; return A[0] - B[0]; }