Srand() e rand()

di il
15 risposte

Srand() e rand()

Ciao a tutti ragazzi... Mi servirebbe un piccolo aiuto!

Ho fatto un programma in C per la distribuzione di carte... vorrei fare una specie di briscola.. per passare il tempo

Pero' non sarebbe molto carino se le carte venissero fuori 2 volte...Come faccio a far si' che con la funzione srand e rand non mi venga la stessa "carta"???

Dopo vi metto quello che ho fatto! Ma se nel frattempo mi aiutate a risolvere questo dubbio ve ne sarei grato!!
Grazie infinite.

15 Risposte

  • Re: Srand() e rand()

    La funzione rand() (la srand() serve per l'inizializzazione) non ti assicura la non duplicazione dei valori, ma solo che escono in modo random in un intervallo prefissato.

    A te non serve un generatore di numeri casuali, ma una permutazione casuale.

    E come si genera una permutazione casuale?

    Piccolo spunto: parti dalla permutazione ordinata, e poi la scompigli!
  • Re: Srand() e rand()

    migliorabile ha scritto:


    La funzione rand() (la srand() serve per l'inizializzazione) non ti assicura la non duplicazione dei valori, ma solo che escono in modo random in un intervallo prefissato.

    A te non serve un generatore di numeri casuali, ma una permutazione casuale.

    E come si genera una permutazione casuale?

    Piccolo spunto: parti dalla permutazione ordinata, e poi la scompigli!

    Non ho capito Ti dispiace spiegarmelo ancora?
  • Re: Srand() e rand()

    Fai delle domande piu' specifiche

    Sai che cosa e' una permutazione?
  • Re: Srand() e rand()

    Un metodo semplice è quello di inserire le carte in un array di n elementi.
    Per estrarre una carta generi un valore randomico da 0 a (n-1).
    Estrai la carta, la elimini e compatti l'array che quindi avrà n-1 elementi validi (elementi contigui).
    Decrementi n.
    Generi un valore randomico da 0 a (n-1)
    Estrai la carta.
    ...
    fino a che non rimani con una sola carta nell'array!
  • Re: Srand() e rand()

    1) prendi un mazzo di carte ordinate dall'asso al 10 per ogni seme (un vettore riempito opportunamente)

    2) mischiale (scambia due carte a caso per un certo numero di volte)

    3) prendi le prime 5 carte (dal vettore) e le altre 5 (sempre dal vettore)
  • Re: Srand() e rand()

    oregon ha scritto:


    1) prendi un mazzo di carte ordinate dall'asso al 10 per ogni seme (un vettore riempito opportunamente)

    2) mischiale (scambia due carte a caso per un certo numero di volte)

    3) prendi le prime 5 carte (dal vettore) e le altre 5 (sempre dal vettore)
    esatto!! e' proprio quello che ho fatto Ma puo' capitare che capiti due volte due donne a cuori ( ad esempio )... Quindi come potrei fare??

    Grazie dell'aiuto!
  • Re: Srand() e rand()

    Non ho ben capito il tuo problema, perché dovrebbe uscire 2 volte la stessa carta?
  • Re: Srand() e rand()

    Ritento con la domanda: sai che cosa e' una permutazione?

    Se usi un permutazione, qualunque sia l'implementazione, come ad esempio descritto precedentemente, e' impossibile che ti esca due volte la stessa carta ...

    Se cio' accade, il tuo codice e' sbagliato
  • Re: Srand() e rand()

    Light ha scritto:


    Non ho ben capito il tuo problema, perché dovrebbe uscire 2 volte la stessa carta?
    io faccio questo esempio per farmi capire:
    Facciamo conto che il programma debba distribuire 5 numeri su 10... molto probabile che esca lo stesso numero, no? cosi' come su 40 carte puo' uscire la stessa carta.. anche se la percentuale e' minore.
    Come faccio a far si che non ci sia due volte lo stesso dato??

    Spero di essermi spiegato bene
    grazie !
  • Re: Srand() e rand()

    migliorabile ha scritto:


    Ritento con la domanda: sai che cosa e' una permutazione?

    Se usi un permutazione, qualunque sia l'implementazione, come ad esempio descritto precedentemente, e' impossibile che ti esca due volte la stessa carta ...

    Se cio' accade, il tuo codice e' sbagliato
    Non so cosa sia una permutazione.. ti dispiace spiegarmelo se puoi??? Programmo da poco
  • Re: Srand() e rand()

    TommasoF ha scritto:


    Light ha scritto:


    Non ho ben capito il tuo problema, perché dovrebbe uscire 2 volte la stessa carta?
    io faccio questo esempio per farmi capire:
    Facciamo conto che il programma debba distribuire 5 numeri su 10... molto probabile che esca lo stesso numero, no? cosi' come su 40 carte puo' uscire la stessa carta.. anche se la percentuale e' minore.
    Come faccio a far si che non ci sia due volte lo stesso dato??

    Spero di essermi spiegato bene
    grazie !
    Sì se tu lo facessi con rand non avresti la garanzia di non estrarre lo stesso numero, però non ti è stato suggerito questo...
    In sostanza tu prendi un array che rappresenta il mazzo di carte e lo mescoli ( per mescolarlo se vuoi c'è un algoritmo fatto apposta per generare casualmente e senza ripetizioni i numeri da 1 ad N) e poi semplicemente elimini dall'array quelle che estrai no?
    ( Col metodo che ha descritto candaluar)
  • Re: Srand() e rand()

    TommasoF ha scritto:


    Facciamo conto che il programma debba distribuire 5 numeri su 10... molto probabile che esca lo stesso numero, no?
    Ciao,
    non hai capito il suggerimento che ti hanno dato.
    Prepari un array fatto così:

    asso_cuori | re_cuori | donna_cuori | jack_cuori | ... | due_picche

    Le carte in totale sono 52, quindi gli elementi dell'array sono numerati da 0 a 51.
    Ora generi un numero compreso tra 0 e 51. Supponiamo che esca 0: corrisponde all'asso di cuori. Lo prelevi dal mazzo, che quindi diventa

    re_cuori | donna_cuori | jack_cuori | ... | due_picche

    Ora generi un altro numero, stavolta da 0 a 50. Se, per caso, dovesse uscire nuovamente 0, questa volta corrisponderà al re di cuori, e non più all'asso che non si trova più nel mazzo.
  • Re: Srand() e rand()

    minomic ha scritto:


    TommasoF ha scritto:


    Facciamo conto che il programma debba distribuire 5 numeri su 10... molto probabile che esca lo stesso numero, no?
    Ciao,
    non hai capito il suggerimento che ti hanno dato.
    Prepari un array fatto così:

    asso_cuori | re_cuori | donna_cuori | jack_cuori | ... | due_picche

    Le carte in totale sono 52, quindi gli elementi dell'array sono numerati da 0 a 51.
    Ora generi un numero compreso tra 0 e 51. Supponiamo che esca 0: corrisponde all'asso di cuori. Lo prelevi dal mazzo, che quindi diventa

    re_cuori | donna_cuori | jack_cuori | ... | due_picche

    Ora generi un altro numero, stavolta da 0 a 50. Se, per caso, dovesse uscire nuovamente 0, questa volta corrisponderà al re di cuori, e non più all'asso che non si trova più nel mazzo.
    Aah xD scusatemi ma non avevo capito... Vi ringrazio per la pazienza!!
  • Re: Srand() e rand()

    TommasoF ha scritto:


    oregon ha scritto:


    1) prendi un mazzo di carte ordinate dall'asso al 10 per ogni seme (un vettore riempito opportunamente)

    2) mischiale (scambia due carte a caso per un certo numero di volte)

    3) prendi le prime 5 carte (dal vettore) e le altre 5 (sempre dal vettore)
    esatto!! e' proprio quello che ho fatto
    Non solo NON è quello che hai fatto ma quello che ti ho scritto non l'hai neanche letto con attenzione ...
Devi accedere o registrarti per scrivere nel forum
15 risposte