public G generate(int N, int k, double p) { G graph = ringLatticeGenerator.generate(N, k); Set<Edge> edges = new HashSet<Edge>(); for (Edge edge : graph.getEdges()) { if (random.nextDouble() < p) { edges.add(edge); } } List<V> vertices = new ArrayList<V>(graph.getVertices().size()); vertices.addAll((Collection<? extends V>) graph.getVertices()); int doubleEdges = 0; for (Edge edge : edges) { V source; if (random.nextBoolean()) { source = (V) edge.getVertices().getFirst(); } else { source = (V) edge.getVertices().getSecond(); } builder.removeEdge(graph, (E) edge); V target = null; while (target == null) { target = vertices.get(random.nextInt(vertices.size())); if (source == target) target = null; } if (builder.addEdge(graph, source, target) == null) doubleEdges++; } logger.debug(String.format("Rejected %1$s double edges.", doubleEdges)); return graph; }