1- using Random: randperm, shuffle!
1+ using Random: randperm, shuffle!, randsubseq
22using Statistics: mean
33using Graphs: sample!
44
@@ -122,6 +122,23 @@ function randbn(
122122 return x
123123end
124124
125+ " maps 1:binomial(n,2) into an upper triangle of [1,n]×[1,n]"
126+ function trianglemap (r)
127+ j = floor (Int, (1 + sqrt (8 r- 7 ))/ 2 ) + 1
128+ i = r - binomial (j- 1 ,2 )
129+ Edge (i, j)
130+ end
131+
132+ " maps 1:n*(n-1) into non-diagonal elements of [1,n]×[1,n]"
133+ function nondiagmap (r,n)
134+ j = div (r- 1 , n- 1 )
135+ i = r - j* (n- 1 )
136+ j += 1
137+ i += (i >= j)
138+ Edge (i, j)
139+ end
140+
141+
125142"""
126143 erdos_renyi(n, p)
127144
@@ -140,7 +157,7 @@ julia> erdos_renyi(10, 0.5)
140157{10, 20} undirected simple Int64 graph
141158
142159julia> erdos_renyi(10, 0.5, is_directed=true, seed=123)
143- {10, 49 } directed simple Int64 graph
160+ {10, 41 } directed simple Int64 graph
144161```
145162"""
146163function erdos_renyi (
@@ -151,13 +168,16 @@ function erdos_renyi(
151168 seed:: Union{Nothing,Integer} = nothing ,
152169)
153170 p >= 1 && return is_directed ? complete_digraph (n) : complete_graph (n)
154- m = is_directed ? n * (n - 1 ) : div (n * (n - 1 ) , 2 )
155- ne = randbn (m, p; rng = rng, seed = seed )
156- return if is_directed
157- SimpleDiGraph (n, ne; rng = rng, seed = seed )
171+ m = is_directed ? n * (n - 1 ) : binomial (n , 2 )
172+ seq = randsubseq ( rng_from_rng_or_seed (rng, seed), 1 : m, p )
173+ g = if is_directed
174+ SimpleDiGraphFromIterator ( nondiagmap (r,n) for r in seq )
158175 else
159- SimpleGraph (n, ne; rng = rng, seed = seed )
176+ SimpleGraphFromIterator ( trianglemap (r) for r in seq )
160177 end
178+ # complete to exactly n vertices
179+ add_vertices! (g, n - nv (g))
180+ return g
161181end
162182
163183"""
0 commit comments