Я использую интерфейс R igraph
для генерации произвольно ориентированной сети (Erdös-Rényi) с постоянным числом узлов n
и ребер m
, используя функцию sample_gnm
.
Чтобы убедиться, что я понимаю, какой алгоритм используется, я проверил исходный код на C, хотя у меня нет опыта работы с C.
Насколько я понимаю код C, есть оператор if
, который должен привести к чрезмерному представлению узлов с индексом n
, получающих направленные ребра.
Это настоящий код:
https://github.com/igraph/igraph/blob/7d4be976481356fa673772e6e7c30b637ea8dd52/src/games.c#L734-L736
и вот как я понимаю код C в псевдокоде:
# What is the maximum number of edges a network with n nodes could have
maxEdges := n*(n-1)
s := uniformly sample m integers from [1, maxEdges] without replacement
for (i = 1; i = m; i++) {
# Get IDs for nodes A and B with equal probability over n
nodeA := floor(s[i] / (n)) + 1
nodeB := s - ((nodeA - 1) * n)
# Since we do not allow loops, if nodeA = nodeB, assign n to nodeB
if (nodeA = nodeB) {
nodeB := n
}
}
Однако я также запускаю симуляцию в R, чтобы убедиться, что это действительно так:
testFun = function(n,m) {
# Generate the network
g = sample_gnm(n, m, directed = TRUE, loops = FALSE)
# Find the "to" node IDs
toEdgename = ends(g, E(g))[, 2]
return(toEdgename)
}
# Create 1000 random networks and get the "to" node name for each edge
spam = replicate(1000, testFun(100, 9000))
# Plot the histogram
hist(sapply(1:ncol(spam),
# Count the percent of times the index 100 appeared per simulation
function(ii) sum(spam[, ii] == 100) / 9000),
100)
К моему удивлению, это не приводит к заметному смещению.
Это должно означать, что я не понимаю, что делает C-код.
Может ли кто-нибудь помочь мне понять, почему этот фрагмент кода C не приводит к чрезмерному представлению индекса n
?