# Functor Rand.I

```module I: `functor (``G`` : ``Sig.I``  with type V.label = int``) -> ``S````  with type graph = G.t
and type vertex = G.V.t
and type edge_label = G.E.label``````
Random imperative graphs
Parameters:
 `G` : `Sig.I with type V.label = int`

`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``
`val gnp : `?loops:bool -> v:int -> prob:float -> unit -> graph``
random graph using the G(n,p) model. `gnp v prob` generates a random graph with exactly `v` vertices and where each edge is selected with probability `prob`
`val gnp_labeled : `(vertex -> vertex -> edge_label) ->       ?loops:bool -> v:int -> prob:float -> unit -> graph``
`gnp_labeled add_edge v e` is similar to `gnp` except that edges are labeled using function `f`.