I think the simplest and most efficient way to simulate the random connection process in a functional manner is to start by generating a shuffled list of d copies of each vertices (this represents the d legs for each vertex), and then pair them up using partition. At this point you have a list of all the undirected edges, so you just add them to your graph. This process should work with any graph representation.
So if your vertices are numbered 0 through 3, and you want 3 edges coming out from each vertex, you begin by shuffling the list: [0 1 2 3 0 1 2 3 0 1 2 3] into something like: [2 1 3 0 3 0 2 2 0 3 1 1] Then partition this into: [[2 1] [3 0] [3 0] [2 2] [0 3] [1 1]] These are your 6 undirected edges which you store in your graph however you like. For demonstration purposes, consider a graph representation where an undirected edge is stored as two directed edges, vertex ids are numbers in (range number-of-nodes), and the graph is just a vector that associates vertex ids with vectors of ids you can get to via outgoing directed edges. A straightforward implementation of graph-building functions: (defn empty-graph [number-of-nodes] (vec (repeat number-of-nodes []))) (defn add-directed-edge [graph node1 node2] (let [node1-neighbors (graph node1)] (assoc graph node1 (conj node1-neighbors node2)))) (defn add-edge [graph [node1 node2]] (-> graph (add-directed-edge node1 node2) (add-directed-edge node2 node1))) And the random generation is easy: (defn random-graph [number-of-nodes number-of-edges] (reduce add-edge (empty-graph number-of-nodes) (partition 2 (shuffle (take (* number-of-nodes number-of-edges) (cycle (range number-of-nodes))))))) -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en