package jetbrains.buildServer.serverSide;

import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

/**
 * @author Eugene Petrenko
 *         Created: 31.03.2010 19:48:09
 */
public class Randomization {
  private final RandomGenerator myRandom;

  public Randomization(RandomGenerator random) {
    myRandom = random;
  }

  public <T> T selectOneOf(Collection<T> items, double probability) {
    if (items.size() == 0) throw new RuntimeException("Collection is empty. Nothing to select");
    if (items.size() == 1) return items.iterator().next();

    for(int i = 0; i < 10 * items.size(); i++) {
      for (T item : items) {
        if (itHappend(probability)) {
          return item;
        }
      }
    }

    return items.iterator().next();
  }

  private boolean itHappend(double probability) {
    return myRandom.getRandom().nextDouble() <= probability;
  }

  public <T> Collection<T> selectSomeOf(Collection<T> items, double probability) {
    Set<T> set = new HashSet<T>(items);

    for (Iterator<T> iterator = set.iterator(); iterator.hasNext();) {
      iterator.next();

      if (!itHappend(probability)) {
        iterator.remove();
      }
    }
    return set;
  }

}

