2013-02-11 16 views
7

Sto provando a simulare il lancio di due dadi. Ho usato:simulare a rotazione due dadi

d2 <- sample(1:6, 10^6, replace = T) + sample(1:6, 10^6, replace = T) 

e ottenere il risultato previsto. Ho anche provato

s2d <- c() 
for (i in 1:6) { 
    for (j in 1:6){ 
    s2d <- c(s2d, (i+j)) 
    } 
} 
d2 <- sample(s2d, 10^6, replace=T) 

e che funziona anche, ma questi mi sento un po ' "forza bruta". C'è un modo più semplice ed elegante per farlo?

In termini più generali, esiste una funzione che richiede 2 (o più) eventi indipendenti e fa operazioni su di essi (aggiunta, moltiplicazione)?

+4

In che modo la prima soluzione sembra forza bruta o poco elegante? È una soluzione a 1 linea. Il tuo problema è che non puoi tirare un numero arbitrario di dadi? –

+0

La prima soluzione è abbastanza semplice, ma mi chiedevo se esiste una funzione che prende due eventi indipendenti e aggiunge (o, addirittura, moltiplicazione per catene di probabilità condizionali). – koenbro

+0

Si noti che la funzione di probabilità del risultato dell'aggiunta del valore * * di due variabili discrete casuali non è una somma, ma la convoluzione delle funzioni di probabilità. Stavi seguendo modi per fare convoluzione? La seconda cosa, dove moltiplichi * le probabilità *, non * i valori * è interamente un diverso tipo di cosa. –

risposta

12

Se il problema è che non si può rotolare qualsiasi numero arbitrario di dadi, qualcosa come:

rowSums(replicate(2, sample(6, 10^6, replace=T))) 

sarebbe più flessibile.

+0

Grazie, questo permette un numero arbitrario di dadi. – koenbro

2

Sono d'accordo con David sul fatto che nulla sembra particolarmente sbagliato con la prima opzione. Un altro modo per andare potrebbe essere questo, se siete davvero solo dopo la somma dei due dadi:

sample(2:12,size = 100,replace = TRUE, prob = table(outer(1:6,1:6,"+"))/36) 
2

c'è una funzione dice nel pacchetto TeachingDemos che simula il rotolamento dei dadi (e v'è anche un opzione per tracciare i risultati, ma 1000 rotoli non renderebbero una trama significativa). Questo può sembrare un po 'meno forza bruta, ma internamente fa simile a quello che è già stato pubblicato. È possibile utilizzare le funzioni apply o correlate per eseguire operazioni come la somma tra le colonne del reso.

Problemi correlati