method private select =
    let (ready_list,n) =
      List.fold_left
        (fun (l,k) (w,s) -> if s.source#is_ready then (s,w)::l,(k+w) else l,k)
        ([],0) children
    in
      if n = 0 then None else
        try
          let sel = if strict then (pos+1) mod n else Random.int n in
            pos <- sel ;
            ignore (List.fold_left
                      (fun k (s,w) ->
                         if k+w > sel then raise (Found s) else (k+w))
                      0 ready_list) ;
            assert false
        with
          | Found s -> Some s