1
- using Random: randperm, shuffle!
1
+ using Random: randperm, shuffle!, randsubseq
2
2
using Statistics: mean
3
3
using Graphs: sample!
4
4
@@ -126,6 +126,23 @@ function randbn(
126
126
return x
127
127
end
128
128
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
+
129
146
"""
130
147
erdos_renyi(n, p)
131
148
@@ -149,7 +166,7 @@ julia> erdos_renyi(10, 0.5)
149
166
julia> using Graphs
150
167
151
168
julia> erdos_renyi(10, 0.5, is_directed=true, seed=123)
152
- {10, 49 } directed simple Int64 graph
169
+ {10, 41 } directed simple Int64 graph
153
170
```
154
171
"""
155
172
function erdos_renyi (
@@ -160,13 +177,16 @@ function erdos_renyi(
160
177
seed:: Union{Nothing,Integer} = nothing ,
161
178
)
162
179
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 )
167
184
else
168
- SimpleGraph (n, ne; rng = rng, seed = seed )
185
+ SimpleGraphFromIterator ( trianglemap (r) for r in seq )
169
186
end
187
+ # complete to exactly n vertices
188
+ add_vertices! (g, n - nv (g))
189
+ return g
170
190
end
171
191
172
192
"""
0 commit comments