Newsgroup: it.comp.lang.c
Titolo: Non mi randomizza compilando con GCC sotto Linux

Il mio problema e' che il comando 
rand() %1000
mi da sempre gli STESSI numeri in sequenza. Qualcuno sa spiegarmi
perche'?
Se la libreria nella quale si trova è stdlib.h sono ancora costretto a
usarci -l nella compilazione o no?
Ho la Redhat 5.2 e non riesco a venire a capo di questo problema
apparentemente molto semplice, ma che mi sta dando non pochi
grattacapi.
Inoltre ho notato che:
typedef struct XXX {.... non funziona.
typedef struct {...} XXX invece si'.
Non capisco.
:)
Ciao e grazie a tutti risposte se potete anche in email, se no potete
fa niente :)
Marco Calcaterra
----------------
CD of the Week: Uhm...
Vgames of the Week: 
Single: Densha De Go! - PSX
Multi: Ultima Online - Origin - PC
IRC Nick: DeSangre
ICQ UIN: 213080

del programma.
Certo ho capito. Immaginavo il fulcro della soluzione fosse nel srand.
Il motivo per il quale avevo semi-immediatamente considerato il
problema "irrisolvibile" era semplicemente per il fatto che
sull'Horowitz (testo di algoritmi in C) e' riportato senza srand.
Con la mia incredibile intelligenza :) ero persino arrivato alla
soluzione (quella del time), ma non ne sapevo la sintassi. Il
protocollo APOP infatti utilizza il timestamp per generare password
ognivolta diverse. Mi stupisco di me stesso. :)
Comunque grazie mille della soluzione.


Marco Calcaterra (
de.s...@flashnet.it
) wrote:
: Il mio problema e' che il comando 
: rand() %1000
: mi da sempre gli STESSI numeri in sequenza. Qualcuno sa spiegarmi
: perche'?
E' cosi' che funziona.
man rand
man srand
: Se la libreria nella quale si trova è stdlib.h sono ancora costretto a
: usarci -l nella compilazione o no?
No.
: Ho la Redhat 5.2 e non riesco a venire a capo di questo problema
: apparentemente molto semplice, ma che mi sta dando non pochi
: grattacapi.
Devi inizializzare il generatore di numeri pseudo-casuali con
un valore...casuale ;). Per esempio, dando un
srand(time(0));
prima di usare rand().
Nota che basta chiamare srand() una volta sola, magari all'inizio
del programma.
Ciao ciao,
Andrea
-- 
"...Unix, MS-DOS, and Windows NT (also known as the Good, the Bad, and 
 the Ugly)."
(by Matt Welsh)

 Non capisco.
Anche questo è normale: solo nel secondo caso fornisci il nuovo nome per
il tipo che stai costruendo.
EMG

 impazzito.
Eccolo:
#!/bin/bash
echo $RANDOM
In DUE (2) righe...
La bash supporta, come variabile particolare, la generazione
dei numeri casuali, vedere "man bash".
bye,
--
  Piergiorgio Sartor
  Sony International (Europe) GmbH
  European R&D Stuttgart
  Advanced TV Group              Tel.: 
++49-(0)711-5858-525
  Stuttgart Technology Center    FAX: 
++49-(0)711-5858-199
  Stuttgarter Strasse 106        e-mail: 
sar...@sony.de
  D-70736 Fellbach, Germany

In DUE (2) righe...
Ah non sapevo proprio dell'esistenza di queste cose in C. Comunque per
una versione con srand e rand chiedo troppo? :)


 impazzito.
Questo funziona. Ha solo il problema che non può essere chiamato più di
una volta al secondo, pena la ripetizione del numero precedente. Questo
succede solo perché la funzione standard time() restituisce i secondi.
Se utilizzassi, ad esempio, la funzione non standard gettime() (presente
in DOS) otterresti la precisione in centesimi di secondo (almeno
teoricamente) e non avresti quel problema.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
    srand( time( 0 ) );
    printf( "%d\n", rand() );
    return 0;
}
EMG

 Ah non sapevo proprio dell'esistenza di queste cose in C.
Infatti non è C. Non so proprio cosa sia...? Forse comandi di console
per Unix/Linux?
EMG


E` uno shell-script. La prima riga serve per essere
sicuri che venga eseguito usando la bash shell.
La seconda stampa un numero a caso tra 0 e 32767
(solo con la bash).
Se usate la bash potete provare a dare "echo $RANDOM"
da linea di comando.
Anche "echo $SECONDS" e` interessante...


Enrico Maria Giordano (
e.m.gi...@flashnet.it
) wrote:
: Marco Calcaterra wrote:
: > 
: > Non funziona, ho provato. 
Giusto per curiosita', perche' non posti il tuo tentativo ?
: > Penso che mi suicidero'. Potresti scrivermi un programma di 
: > 3 righe che stampi un numero casuale ? Io sono impazzito.
Mi sembra che l'esempio di EMG vada bene...
[ snip ]
: Se utilizzassi, ad esempio, la funzione non standard gettime() 
: (presente in DOS) otterresti la precisione in centesimi di 
: secondo (almeno teoricamente) e non avresti quel problema.
Sotto Linux puoi usare gettimeofday().
Per esempio:
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
int main()
{
        struct timeval t;
        if(gettimeofday(&t, NULL) == (int)-1) {
                perror("gettimeofday");
                exit(EXIT_FAILURE);
        } else {
                srand((unsigned int)t.tv_usec);
                printf("%10d\n", rand());
        }
        return EXIT_SUCCESS;
