Newsgroup: it.comp.lang.c++
Titolo: Soluzione:

Siccome il mio codice era unpo' bacato, cioè mi uscivano dei numeri poco
realistici, ieri mi hanno dato questa bella dritta.
Solo che devi togliere argv e argc:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
static int lancio(void);
int main(int argc, char **argv)
{
        int n;
        if (argc <= 1) {
                fprintf(stderr, "Usage: dadi <numero tiri>\n");
                exit(1);
        }
        n = strtol(argv[1], NULL, 10);
        srand((unsigned int)time(NULL));
        while(n--) {
                int dado1, dado2;
                dado1 = lancio();
                dado2 = lancio();
                printf("%d\n", dado1+dado2);
        }
        return 0;
}
#define MAX             6
#define MAXMULT         ((((unsigned)RAND_MAX+1)/MAX)*MAX)
int lancio(void)
{
        unsigned int r;
        while((r = rand()) >= MAXMULT)
                ;
        return (r % MAX) + 1;
}
Provalo funziona bene
CMQ il Codice è di Antirez
BYEZ!!

Oddio ho sbagiato, doveva essere una reply ma č stato un post.
Scusatemi

 }
Huh?  Perche' tutta questa complicazione?  In sostanza ti preoccupi
del fatto che RAND_MAX potrebbe non essere divisibile per sei, e che
quindi prendendo rand() % 6 i vaolri piu' alti potrebbero presentarsi
meno spesso di quanto previsto da una distribuzione uniforme.  Ammesso
che tu sia su una piattaforma dove rand restituisce un numero tra 0 e
32767, questo accade (32767-32765)/32767, cioe' circa una volta su
sedicimila e fischia :-)  A questo livello, preoccupati piuttosto del
fatto che il generatore interno del compilatore ha proprieta'
statistiche generalmente da schifo, e che il modulo peggiora le cose
(e' abbastanza frequente che rand()%2 restituisca sequenze 0 1 0 1 0 1
sempre uguali).  Allora fai piuttosto
        return (int) (((double) rand() / RAND_MAX) * 6.0) + 1
o cambia generatore (e.g. Mersenne Twister,
http://www.math.keio.ac.jp/matumoto/emt.html
).
-- 
Maurizio Loreti  - Linux Is Not UniX -  
http://www.pd.infn.it/~loreti/mlo.html
Univ. of Padova, Dept. of Physics - Padova, Italy            
lor...@pd.infn.it

"Maurizio Loreti" ha scritto
:
: Huh?  Perche' tutta questa complicazione?  In sostanza ti preoccupi
: del fatto che RAND_MAX potrebbe non essere divisibile per sei, e che
: quindi prendendo rand() % 6 i vaolri piu' alti potrebbero presentarsi
: meno spesso di quanto previsto da una distribuzione uniforme.  Ammesso
: che tu sia su una piattaforma dove rand restituisce un numero tra 0 e
: 32767, questo accade (32767-32765)/32767, cioe' circa una volta su
: sedicimila e fischia :-)  A questo livello, preoccupati piuttosto del
: fatto che il generatore interno del compilatore ha proprieta'
: statistiche generalmente da schifo, e che il modulo peggiora le cose
: (e' abbastanza frequente che rand()%2 restituisca sequenze 0 1 0 1 0 1
: sempre uguali).  Allora fai piuttosto
:
:         return (int) (((double) rand() / RAND_MAX) * 6.0) + 1
Mi permetto di osservare che RAND_MAX e` il massimo della funzione
rand() e quindi in media una volta ogni RAND_MAX questa formuletta
restituisce 7.
Pertanto, ricordando sempre la 1a legge di Murphy che in uno dei suoi
enunciati dice appunto che se una fetta di pane imburrata cade per
terra, cade dalla parte imburrata..., io suggerisco
     double const d = 6.0 / (1.0 + RAND_MAX);
     return int( d * rand() ) + 1;
ciao
Massimo

 rand()
Non dovrebbe essere l'estremo superiore?  0 <= rand() < RAND_MAX?
Ma posso sbagliarmi :-(


 Ma posso sbagliarmi :-(
Si, mi sbagliavo.  0 <= rand() <= RAND_MAX (ISO/IEC 9899-1999 7.20.2.1).
Scusate.
