# Module type Rand.S

    module type S = sig .. end

    type graph

    type vertex

    type edge_label

    val graph : ?loops:bool -> v:int -> e:int -> unit -> graph

`graph v e` generates a random graph with exactly `v` vertices and `e` edges. Vertices are labeled with `0` ... `v-1`. The boolean `loops` indicates whether loops are allowed; default value is no loop (`false`).
Raises `Invalid_argument` if `e` exceeds the maximal number of edges.

    val labeled : (vertex -> vertex -> edge_label) ->
           ?loops:bool -> v:int -> e:int -> unit -> graph

`labeled f` is similar to `graph` except that edges are labeled using function `f`.
Raises `Invalid_argument` if there are too many edges.
The two functions above actually make a choice between two different implementations according to the ratio e/(v*v). When this ratio is small, `random_few_edges` is selected; otherwise `random_many_edges` is selected.

    val random_few_edges : loops:bool -> v:int -> e:int -> graph

    val random_many_edges : loops:bool -> v:int -> e:int -> graph