RandomUniqueInteger.java

/**
 * @(#)RandomIntegerList.java
 * Copyright (C) 2008-2011 delhezi.com
 *
 * This class is released under the:
 * GNU Lesser General Public License (LGPL) version 3 or later.
 * http://www.gnu.org/copyleft/lesser.html
 */
package com.delhezi.ga.utility;

import java.util.LinkedList;
import java.util.List;

/**
 * Klasa <code>RandomIntegerList</code>: Losowanie wartości typu Integer,
 * z zadanego przedziału (od 1 do size), bez powtórzeń.
 *
 * Rozwiązanie oparte na zbiorze uporządkowanym z dostępem po indeksie,
 * z którego wylosowana wartość jest automatycznie usuwana.
 * Po wylosowaniu elementu jest on usuwany ze zbioru i zwracany do
 * wywołującego. Kolejne losowanie odbywa się z mniejszego zbioru.
 * @version 1.0 2009-06-10
 * @author <a href="mailto:wojciech.wolszczak@delhezi.com">
 * Wojciech Wolszczak</a>
 */
public class RandomUniqueInteger {

        /** Lista liczb. */
        private List<Integer> liczby;

        /**
         * Inicjacja obiektu.
         * @since 1.0
         */
        private final void init(int size) {
                // Tworzymy zbiór liczb.
                liczby = new LinkedList<Integer>();
                // Dodajemy kolejne liczby do zbioru.
                for (int i = 1; i < size + 1; i++) {
                        liczby.add(new Integer(i));
                }
        }

        /**
         * Losowanie liczby z zakresu <1,size>.
         * @return Liczba z zakresu <1,size>.
         * @since 1.0
         */
        public final Integer get() {
                Integer i = (int) (Math.random() * liczby.size());
                i = liczby.get(i);
                liczby.remove(i);
                return i;
        }

        /**
         * Wielkość zbioru.
         * @return Wielkość zbioru.
         * @since 1.0
         */
        public int getSize() {
                return liczby.size();
        }

        /**
         * Konstruktor.
         * @param size Wielkość zbioru z którego losujemy elementy
         *             (zbiór będzie zawirał elementy 1 do size).
         * @since 1.0
         */
        public RandomUniqueInteger(final int size) {
            if (size <= 0) {
                throw new IllegalArgumentException(
                          "Wielkość musi być większa od 0");
            }
                init(size);
        }

}