Distribuzione multinomiale

di il
2 risposte

Distribuzione multinomiale

Ciao a tutti!
Il mio problema consiste nel scrivere una distribuzione multinomiale in c++.
Un algoritmo già esistente (chiamato binomial_distribution) mi permette di calcolare la probabilità di un evento di questo tipo, tuttavia quando si tratta di applicare questa probabilità a un evento multinomiale sono ferma.
Vi allego la referenza di binomial_distribution [https://en.cppreference.com/w/cpp/numeric/random/binomial_distribution][/https://en.cppreference.com/w/cpp/numeric/random/binomial_distribution], e la definizione di multinomial_distribution [https://it.wikipedia.org/wiki/Distribuzione_multinomiale][/https://it.wikipedia.org/wiki/Distribuzione_multinomiale], se qualcuno avesse una qualche idea da condividere gliene sono grata!


Grazie!
Allegati:
29750_dbb9039d4fc04efaca0aabe324d24f41.jpg
29750_dbb9039d4fc04efaca0aabe324d24f41.jpg

29750_9335348af4784b8656c315d1f26d591f.jpg
29750_9335348af4784b8656c315d1f26d591f.jpg

2 Risposte

  • Re: Distribuzione multinomiale

    Richiesta vaga...

    Un esempio classico con i lanci di una moneta è questo
    
    #include <cstdlib>
    #include <ctime>
    #include <random>
    #include <iostream>
    
    using namespace std;
    
    const int sessioni_di_lancio_moneta = 100;
    const int lanci_moneta_per_sessione = 4;
    int numero_di_teste_per_sessione[sessioni_di_lancio_moneta] = {0};
    int risultati_sessioni[lanci_moneta_per_sessione + 1] = {0};
    int risultati_teorici[lanci_moneta_per_sessione + 1] = {0};
    
    int main(void) {
        // seed numeri random
        srand(time(0));
        
        cout << "Totale sessioni di lancio della moneta: " << sessioni_di_lancio_moneta << endl;
        cout << "Totale lanci della moneta all'interno della sessione: " << lanci_moneta_per_sessione << endl;  
        cout << endl;
            
        // simulazione sessione lanci di moneta
        int i, j;
        for(i = 0; i < sessioni_di_lancio_moneta; i++)
            for(j = 0; j < lanci_moneta_per_sessione; j++)
                if(rand() & 1)
                    numero_di_teste_per_sessione[i]++;
            
        // risultati lanci
        for(i = 0; i < sessioni_di_lancio_moneta; i++){    
            cout << "Totale teste nella sessione di lancio " << i + 1 << " : " << numero_di_teste_per_sessione[i] << endl;
            risultati_sessioni[numero_di_teste_per_sessione[i]]++;
        }
        cout << endl;
        
        // distribuzione teorica 
        default_random_engine generatore;
        binomial_distribution<> teste(lanci_moneta_per_sessione, 0.5); 
        for(i = 0; i < sessioni_di_lancio_moneta; i++)
            risultati_teorici[teste(generatore)]++;
        
        // previsioni teoriche
        for(j = 0; j <= lanci_moneta_per_sessione; j++)
            cout << "Numero di sessioni stimate in cui escono " << j << " teste : " << risultati_teorici[j] << endl;
        cout << endl;
        
        // risultati simulazioni
        for(j = 0; j <= lanci_moneta_per_sessione; j++)
            cout << "Numero di sessioni in cui sono uscite " << j << " teste : " << risultati_sessioni[j] << endl;
      
        return 0;
    }
    
  • Re: Distribuzione multinomiale

    In effetti è un po vaga si cerco di essere più chiara!
    allego il codice che ho provato a scrivere, tuttavia penso ci siano errori negli argomenti della distribuzione binomiale (binomial_distribution) ma non so di preciso cosa farci passare..
    [#include "RandomNumbers.h"

    RandomNumbers::RandomNumbers(unsigned long int s) : seed(s) {
    if (seed == 0) {
    std::random_device rd;
    seed = rd();
    }
    rng.seed(seed);
    }


    int RandomNumbers::binomial_distribution(int trials, int probability){
    std::binomial_distribution<> binomial(trials, probability);
    return binomial(rng);
    }

    void RandomNumbers::multinomial_distribution (std::vector<unsigned int>& alleles) {

    int total_size (0);
    int total_sum (0);
    for(size_t i = 0; i<=alleles.size(); ++i) {
    total_size+=i;
    }
    for (auto valeur: alleles){
    total_sum += valeur;
    }
    int new_size (total_size);
    for (size_t i = 0; i <= alleles.size(); i++){
    if (alleles == 0){
    continue;
    }else{
    size_t temp = alleles;
    alleles = binomial_distribution(new_size,(alleles)/total_size);
    new_size-= alleles;
    total_size = temp;
    }
    }
    }][/code]


    Grazie dell'aiuto!
Devi accedere o registrarti per scrivere nel forum
2 risposte