1: // sample -- Make a random permutation of the contents of an array. 3: #include <stdio.h> 5: #include "permuted_sample.H" 6: #include "prng.H" 9: // Nijenhuis & Wiff's random permutation algorithm RANPER, "Combinatorial Algorithms" pp 62-64. 10: // 11: void permute(prng rand, long* slot, long n) { 12: long m; // loop index 13: long R; // a random number 14: long t; // temp for swapping 2 slots 16: for (m = 0; m < n; m++) { // for all slots in the array 18: R = rand.next(m, n); // pick a slot ahead of the current one 20: t = slot[m]; // swap that slot with the current one 21: slot[m] = slot[R]; 22: slot[R] = t; 23: } 24: } 27: permuted_sample::permuted_sample(prng rand, long n, long N) { 28: slot = new long[n]; // make an array to hold the samples 29: sample(rand, slot, n, N); // take a random sample 30: permute(rand, slot, n); // permute its ordering 31: } 34: permuted_sample::~permuted_sample() { // destroy a sample 35: delete[] slot; 36: } 39: long permuted_sample::operator()(long i) { // fetch sample[i] 40: return slot[i]; 41: }