   result. For example, one could do the following to set a seed
   dynamically:
 
-      :random.seed(:erlang.now)
-
-  The implementation assumes that the sample being returned
-  can fit into memory.
+      :random.seed(:os.timestamp)
+
+  The implementation is based on the
+  [reservoir sampling](http://en.wikipedia.org/wiki/Reservoir_sampling#Relation_to_Fisher-Yates_shuffle)
+  algorithm.
+  It assumes that the sample being returned can fit into memory;
+  the input collection doesn't have to - it is traversed just once.
 
   ## Examples
 

      1
      iex> Enum.sample([1,2,3])
      2
      iex> Enum.sample(1..10, 2)
      [5, 8]
      iex> Enum.sample(?a..?z, 5)
      'vxmks'

  """
  @spec sample(t) :: element | nil

  end

  @doc """
  Returns a random element of a collection.

  Notice that you need to explicitly call `:random.seed/1` and
  set a seed value for the random algorithm. Otherwise, the
