package ivory.lsh.data; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.util.Random; import tl.lin.data.array.ArrayListOfIntsWritable; public class PermutationByBit extends Permutation { private Random rand; private ArrayListOfIntsWritable randPerm; private int length; /** * @param i * length of permutation */ public PermutationByBit(int i){ rand = new Random(); randPerm = new ArrayListOfIntsWritable(); for(int j = 0; j < i; j++){ randPerm.add(j); } length = i; } public ArrayListOfIntsWritable nextPermutation() { for(int k = 0; k < length; k++) { int i = rand.nextInt(length); int j = randPerm.get(i); randPerm.set(i, randPerm.get(k)); randPerm.set(k, j); } return new ArrayListOfIntsWritable(randPerm); } public static void main(String[] args){ int SIZE = 1000; PermutationByBit p = new PermutationByBit(SIZE); for(int k=0;k<100;k++){ ArrayListOfIntsWritable a = p.nextPermutation(); //make sure the permutation is not out of bounds for(int i=0;i<SIZE;i++){ assertTrue(i+"-->"+a.get(i),a.get(i)<SIZE && a.get(i)>=0); } //make sure each position is included in the permutation exactly once int[] positions = new int[SIZE]; for(int i=0;i<SIZE;i++){ if(positions[a.get(i)]==1){ fail("Same position included twice: "+a.get(i)); } positions[a.get(i)]=1; } for(int i=0;i<SIZE;i++){ if(positions[i]==0){ // System.out.println(java.util.Arrays.binarySearch(positions, i)); fail("Position not included: "+i); } } assertTrue(sum(positions)+"",sum(positions)==SIZE); } System.out.println("done"); } private static int sum(int[] positions){ int sum=0; for(int i=0;i<positions.length;i++){ sum+=positions[i]; } return sum; } }