2016-05-21 19 views
1

Jedes Mal, wenn ich den Code unten ausführe, bekomme ich eine andere Antwort, meistens 1, 3, 4 oder 5. Da ich jedoch eine Million bin, denke ich, dass das ziemlich seltsam ist, also dachte ich, dass da etwas nicht stimmt mein Code. Dies ist das erste Mal, dass ich R verwende, aber ich bin mir nicht sicher, ob es ein mathematischer Fehler oder ein Codierungsfehler ist.Unterschiedliches Ergebnis für jedes Experiment, selbst wenn n = 1.000.000.000 in R, was ist falsch?

Was ich bin zu simulieren:

Es gibt 40 Personen in einer Gruppe, von denen ein Arzt ist.

Am Tag 0 wird eine Person infiziert; dann for i = 1, 2, ..., T:

  • Tag i: alle verbleibenden gesunden Menschen hat eine Wahrscheinlichkeit von 0,15 von infiziert;
  • Tag i + 1: der Arzt heilt höchstens 5 Personen (einschließlich sich selbst);

Die oben genannten stoppt bis zum Tag T, wenn es keine infizierten Menschen mehr gibt.

Mein Code jetzt (Verdacht falsch):

SampleT <- function(n) 
{ 
    for (k in 1:n) 
    { 
     T <- 0 # day 0 
     X <- 39 # amount of healthy people 
     Y <- 1 # amount of infected people 
     cured <- 0 # amount of people cured by doctor 
     while(cured < Y) 
     { 
     T <- T+1 # increase day by 1 in each loop 
     infected <- sum((runif(X)<0.15)) # amount of people infected on day T 
     X <- X-infected # remaining healthy people 
     Y <- 40-X # total amount of people who have been infected at least once so far 
     cured <- cured + 5 
     } 
     return(T) 
    } 
} 

n <- 1000000000 
T <- SampleT(n) 
mean(T) 

Antwort

4

Ihre for-Schleife läuft nur die erste Iteration. Sobald 'return' innerhalb einer Funktion, die das Ende ist, getroffen wird, wird das Ergebnis zurückgegeben und die Funktion beendet. Wenn Sie planen, eine Million Ergebnisse zu erhalten, müssen Sie diese irgendwo speichern und dann das Ergebnis zurückgeben, nachdem die Schleife ausgeführt wurde. Hier ist ein Beispiel zur Veranschaulichung:

f <- function(n){ 
    for(i in 1:n){ 
    print(i) 
    return(i) 
    } 
    # were you thinking it would return all 'n' values? 
} 

Dann, wenn wir es laufen ...

> f(30) 
[1] 1 
[1] 1 
2

auch versuchen, mit apply Funktionen:

N <- 10000 
SampleT <- sapply(1:N, function(n) { 
    T <- 0 # day 0 
    X <- 39 # amount of healthy people 
    Y <- 1 # amount of infected people 
    cured <- 0 # amount of people cured by doctor 

    while(cured < Y) 
    { 
    T <- T + 1 # increase day by 1 in each loop 

    infected <- sum((runif(X) < 0.15)) # amount of people infected on day T 
    print(infected) 
    X <- X - infected # remaining healthy people 
    Y <- Y + infected # total amount of people who have been infected at least once so far 
    cured <- cured + 5 
    } 
    return (T) 
}) 


mean(SampleT)