1
- using Random: randperm, shuffle!
1
+ using Random: randperm, shuffle!, randsubseq
2
2
using Statistics: mean
3
3
using Graphs: sample!
4
4
@@ -122,6 +122,23 @@ function randbn(
122
122
return x
123
123
end
124
124
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
+
125
142
"""
126
143
erdos_renyi(n, p)
127
144
@@ -140,7 +157,7 @@ julia> erdos_renyi(10, 0.5)
140
157
{10, 20} undirected simple Int64 graph
141
158
142
159
julia> erdos_renyi(10, 0.5, is_directed=true, seed=123)
143
- {10, 49 } directed simple Int64 graph
160
+ {10, 41 } directed simple Int64 graph
144
161
```
145
162
"""
146
163
function erdos_renyi (
@@ -151,13 +168,16 @@ function erdos_renyi(
151
168
seed:: Union{Nothing,Integer} = nothing ,
152
169
)
153
170
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 )
158
175
else
159
- SimpleGraph (n, ne; rng = rng, seed = seed )
176
+ SimpleGraphFromIterator ( trianglemap (r) for r in seq )
160
177
end
178
+ # complete to exactly n vertices
179
+ add_vertices! (g, n - nv (g))
180
+ return g
161
181
end
162
182
163
183
"""
0 commit comments