def rand_graph(num_nodes, num_edges, idtype=F.int64, device=F.cpu()):
    """Generate a random graph of the given number of nodes/edges and return.

    It uniformly chooses ``num_edges`` from all possible node pairs and form a graph.
    The random choice is without replacement, which means there will be no multi-edge
    in the resulting graph.

    To control the randomness, set the random seed via :func:`dgl.seed`.

    Parameters
    ----------
    num_nodes : int
        The number of nodes
    num_edges : int
        The number of edges
    idtype : int32, int64, optional
        The data type for storing the structure-related graph information
        such as node and edge IDs. It should be a framework-specific data type object
        (e.g., torch.int32). By default, DGL uses int64.
    device : Device context, optional
        The device of the resulting graph. It should be a framework-specific device
        object (e.g., torch.device). By default, DGL stores the graph on CPU.

    Returns
    -------
    DGLGraph
        The generated random graph.

    See Also
    --------
    rand_bipartite

    Examples
    --------
    >>> import dgl
    >>> dgl.rand_graph(100, 10)
    Graph(num_nodes=100, num_edges=10,
          ndata_schemes={}
          edata_schemes={})
    """
    # TODO(minjie): support RNG as one of the arguments.
    eids = random.choice(num_nodes * num_nodes, num_edges, replace=False)
    eids = F.zerocopy_to_numpy(eids)
    rows = F.zerocopy_from_numpy(eids // num_nodes)
    cols = F.zerocopy_from_numpy(eids % num_nodes)
    rows = F.copy_to(F.astype(rows, idtype), device)
    cols = F.copy_to(F.astype(cols, idtype), device)
    return convert.graph(
        (rows, cols), num_nodes=num_nodes, idtype=idtype, device=device
    )
Generate a random graph of the given number of nodes/edges and return.

    It uniformly chooses ``num_edges`` from all possible node pairs and form a graph.
    The random choice is without replacement, which means there will be no multi-edge
    in the resulting graph.

    To control the randomness, set the random seed via :func:`dgl.seed`.

    Parameters
    ----------
    num_nodes : int
        The number of nodes
    num_edges : int
        The number of edges
    idtype : int32, int64, optional
        The data type for storing the structure-related graph information
        such as node and edge IDs. It should be a framework-specific data type object
        (e.g., torch.int32). By default, DGL uses int64.
    device : Device context, optional
        The device of the resulting graph. It should be a framework-specific device
        object (e.g., torch.device). By default, DGL stores the graph on CPU.

    Returns
    -------
    DGLGraph
        The generated random graph.

    See Also
    --------
    rand_bipartite

    Examples
    --------
    >>> import dgl
    >>> dgl.rand_graph(100, 10)
    Graph(num_nodes=100, num_edges=10,
          ndata_schemes={}
          edata_schemes={})
    
python/dgl/generators.py