code: public static <T> List<T> selectRandomSubset (Collection<T> col, int count)
      {
          int csize = col.size();
          if (csize < count) {
              String errmsg = "Cannot select " + count + " elements " +
                  "from a collection of only " + csize + " elements.";
              throw new IllegalArgumentException(errmsg);
          }
  
          ArrayList<T> subset = new ArrayList<T>(count);
          Iterator<T> iter = col.iterator();
          int s = 0;
  
          for (int k = 0; iter.hasNext(); k++) {
              T elem = iter.next();
  
              // the probability that an element is select for inclusion in our
              // random subset is proportional to the number of elements
              // remaining to be checked for inclusion divided by the number of
              // elements remaining to be included
              float limit = ((float)(count - s)) / ((float)(csize - k));
  
              // include the record if our random value is below the limit
              if (Math.random() < limit) {
                  subset.add(elem);
  
                  // stop looking if we've reached our target size
                  if (++s == count) {
                      break;
                  }
              }
          }
  
          return subset;
      }
docs: Returns a list containing a random selection of elements from the
  specified collection. The total number of elements selected will be
  equal to <code>count</code>, each element in the source collection will
  be selected with equal probability and no element will be included more
  than once. The elements in the random subset will always be included in
  the order they are returned from the source collection's iterator.
  
  <p> Algorithm courtesy of William R. Mahoney, published in
  <cite>Dr. Dobbs Journal, February 2002</cite>.
  
  @exception IllegalArgumentException thrown if the size of the collection
  is smaller than the number of elements requested for the random subset.