1- using Random: randperm, shuffle!
1+ using Random: randperm, shuffle!, randsubseq
22using Statistics: mean
33using Graphs: sample!
44
@@ -126,6 +126,23 @@ function randbn(
126126 return x
127127end
128128
129+ " maps 1:binomial(n,2) into an upper triangle of [1,n]×[1,n]"
130+ function trianglemap (r)
131+ j = floor (Int, (1 + sqrt (8 r- 7 ))/ 2 ) + 1
132+ i = r - binomial (j- 1 ,2 )
133+ Edge (i, j)
134+ end
135+
136+ " maps 1:n*(n-1) into non-diagonal elements of [1,n]×[1,n]"
137+ function nondiagmap (r,n)
138+ j = div (r- 1 , n- 1 )
139+ i = r - j* (n- 1 )
140+ j += 1
141+ i += (i >= j)
142+ Edge (i, j)
143+ end
144+
145+
129146"""
130147 erdos_renyi(n, p)
131148
@@ -149,7 +166,7 @@ julia> erdos_renyi(10, 0.5)
149166julia> using Graphs
150167
151168julia> erdos_renyi(10, 0.5, is_directed=true, seed=123)
152- {10, 49 } directed simple Int64 graph
169+ {10, 41 } directed simple Int64 graph
153170```
154171"""
155172function erdos_renyi (
@@ -160,13 +177,16 @@ function erdos_renyi(
160177 seed:: Union{Nothing,Integer} = nothing ,
161178)
162179 p >= 1 && return is_directed ? complete_digraph (n) : complete_graph (n)
163- m = is_directed ? n * (n - 1 ) : div (n * (n - 1 ) , 2 )
164- ne = randbn (m, p; rng = rng, seed = seed )
165- return if is_directed
166- SimpleDiGraph (n, ne; rng = rng, seed = seed )
180+ m = is_directed ? n * (n - 1 ) : binomial (n , 2 )
181+ seq = randsubseq ( rng_from_rng_or_seed (rng, seed), 1 : m, p )
182+ g = if is_directed
183+ SimpleDiGraphFromIterator ( nondiagmap (r,n) for r in seq )
167184 else
168- SimpleGraph (n, ne; rng = rng, seed = seed )
185+ SimpleGraphFromIterator ( trianglemap (r) for r in seq )
169186 end
187+ # complete to exactly n vertices
188+ add_vertices! (g, n - nv (g))
189+ return g
170190end
171191
172192"""
0 commit comments