Estrazione casuale senza ripetizione

di il
5 risposte

Estrazione casuale senza ripetizione

Salve a tutti, 

Sto svolgendo un esercizio e anche se non richiesto esplicitamente dall'esercizio stesso, la logica mi impone di realizzare un'estrazione casuale senza ripetizione. 

In particolare ho una struttura Persona con diversi campi tra cui il nome della persona e dopodiché ho un array di puntatori a strutture. Il numero di persone può andare da un minimo di 1 a un massimo di 4. L'esercizio mi richiede che attraverso una funzione vada ad estrarre casualmente una persona (attraverso un estrazione casuale di un numero) e chiedere alla persona corrispondente di inserire il proprio nome. Qui entra in gioco la logica secondo cui una persona dopo aver immenso il proprio nome non può più essere chiamata (estratta) e il tutto deve funzionare attraverso un'estrazione casuale di numeri. 

Purtroppo, non ho righe di codice già scritte in quanto sono in difficoltà e l'unico caso che ho svolto è il caso in cui ci sia una sola persona. 

Spero di essermi spiegato e naturalmente non pretendo che mi venga consegnato il codice completo ma anche solo il ragionamento che posso seguire. Grazie a chiunque risponderà. 

5 Risposte

  • Re: Estrazione casuale senza ripetizione

    Se contrassegni in qualche modo gli elementi già usciti, puoi passare al successivo (o al precedente, o alternando ad ogni estrazione) finché non ne becchi uno non ancora uscito.

  • Re: Estrazione casuale senza ripetizione

    Il contrassegno è proprio il nome, se presente è stato già estratto

  • Re: Estrazione casuale senza ripetizione

    /*pseudocodice*/
    boolean inserito = vero
    boolean trovato = falso
    
    //ciclo che gira finchè non inserisco un nome valido
    while (inserito == vero)
        inserisci nome da tastiera
        trovato = funzione scorri_e_cerca_nome_nella_tua_struttura_dati(nome)
        if trovato == falso 
           inserito = falso // esco dal ciclo 
    inserisci_nella_struttura(nome)       
    

    Un'idea di codifica dei suggerimenti che ti hanno già dato

  • Re: Estrazione casuale senza ripetizione

    Supponi di dover estrarre N numeri, da 1 a N, SENZA RIPETIZIONE.

    Ovviamente, NON PUOI estrerre piu' di N numeri

    Un Generatore di Numeri Casuali, per SUA STESSA natura, GENERA numeri duplicati PERCHE' e' in grado di generare sequenze di LUNGHEZZA arbitraria.

    Quindi, usare un GNC direttamente, non e' possibile.

    Serve un meccanismo alernativo.

    Ci sono 2 modi:

    UNO:

    ti tieni traccia dei numeri gia' usciti, quindi, ogni volta che generi un numero casuale, SE E'  gia' uscito, lo scarto e ne generi uno nuovo.

    Funziona ma diventa SEMPRE PIU' LENTO a mano a mano che generi i numeri.

    DUE

    PREPARI un vettore di N interi che vanno da 1 a N: [1,2,3,…,N]

    per costruzione, ogni intero tra 1 e N e' presente un'UNICA volta

    ora prendi il vettore e LO MESCOLI. E' ovvio che DOPO il mescolamento l'ordine degli interi e' CASUALE, ma allo stesso tempo, ogni intero continua ad essere presente UN'UNICA volta.

    ora ritorni l'intero in posizione 1,2,…N del vettore mescolato

    Et VOILA' che hai ottenuto una sequenza di interi da 1 a N SENZA RIPETIZIONE.

    ---

    Come si mescola un vettore?

    ;-)

  • Re: Estrazione casuale senza ripetizione

    Se cerchi bene ci sono degli esempi di mescolamento anche con il codice, è una domanda classica

Devi accedere o registrarti per scrivere nel forum
5 risposte