package shuffler;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/**
 * Shuffles the List to random permutation
 * @author Winston   Prakash
 */
public class DataShuffler {
    
    private int rand(int i){
        return (int)Math.floor(Math.random()*i);
    }
    
    Random random = new Random(System.currentTimeMillis());
    
    public DataShuffler() {
        
    }
    
    private int max;
    private int[] deck;
    public DataShuffler(int[] deck) {
        this.deck = deck;
        max = deck.length;
    }
    
    public int next(){
        int i = rand(max);
        int tmp = deck[i];
        deck[i] = deck[--max];
        deck[max] = tmp;
        return tmp;
    }
    
    /**
     * Linear shuffle
     * Simply exchange each element of the deck with a random element of the deck
     */
    public <T> List<T>  shuffle(List<T> oldDeck){
        int[] deck = new int[oldDeck.size()];
        for( int i = 0; i < deck.length; i++){
            deck[i] = i;
        }
        for (int j = 0; j < deck.length; j++) {
            int randomIndex = j + random.nextInt(deck.length - j);
            int tmp = deck[j];
            deck[j] = deck[randomIndex];
            deck[randomIndex] = tmp;
            
        }
        List<T> newDeck = new ArrayList<T>();
        for (int j = 0; j < oldDeck.size(); j++) {
            newDeck.add(j, oldDeck.get(deck[j]));
        }
        return newDeck;
    }
}