double_edge_swap looks like it samples nodes proportional to degree:
http://networkx.lanl.gov/svn/networkx/trunk/networkx/generators/degree_seq.py
A while back I sent this to someone asking about choosing k random
edges uniformly from a large graph. It might be more useful depending on
exactly what you are doing and the number of edges in the graph.
Aric
import networkx
from random import random, shuffle
def random_items(iterable, k=1):
# Raymond Hettinger's recipe
# http://code.activestate.com/recipes/426332/
result = [None] * k
for i, item in enumerate(iterable):
if i < k:
result[i] = item
else:
j = int(random() * (i+1))
if j < k:
result[j] = item
shuffle(result)
return result
def all_edges_iter(G,k=1,data=False):
if data:
for n,nbrs in G.adj.iteritems():
for nbr,data in nbrs.iteritems():
yield (n,nbr,data)
else:
for n,nbrs in G.adj.iteritems():
for nbr in nbrs:
yield (n,nbr)
def random_edges(G,k=1,data=False):
"""Choose k random edges uniformly from G.
For undirected graphs this might produce duplicates
since each edge is considered twice, once for each
representation u-v and v-u. Duplicates can be removed by
using set(random_edges()).
"""
return random_items(all_edges_iter(G,data=data),k=k)
if __name__ == "__main__":
import networkx
G=networkx.star_graph(100)
print random_edges(G,6,data=True)