2 * Copyright (C) 2015, United States Government, as represented by the
3 * Administrator of the National Aeronautics and Space Administration.
6 * The Java Pathfinder core (jpf-core) platform is licensed under the
7 * Apache License, Version 2.0 (the "License"); you may not use this file except
8 * in compliance with the License. You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0.
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
18 package gov.nasa.jpf.util;
20 import java.util.NoSuchElementException;
21 import java.util.Random;
24 * a permutation generator that uses the Fisher-Yates shuffle
25 * (Durstenfeld, R. (July 1964). "Algorithm 235: Random permutation".
26 * Communications of the ACM 7 (7): 420)
28 * use this if TotalPermutations would be too large and PairPermutations
31 public class RandomPermutationGenerator extends PermutationGenerator {
34 protected Random rand;
38 public RandomPermutationGenerator (int nElements, int nPermutations, int seed){
40 this.nPermutations = nPermutations;
41 rand = new Random(seed);
42 orig = permutation.clone();
46 protected long computeNumberOfPermutations() {
47 return nPermutations; // it's input (set)
53 rand = new Random(seed);
63 } else if (nGenerated < nPermutations){
64 permutation = orig.clone();
65 for (int i=0; i<nElements; i++){
66 int r = i + rand.nextInt( nElements-i); // i <= r < nElements-1
67 swap(permutation, r, i);
73 throw new NoSuchElementException();