Newsgroup: it.comp.lang.c
Titolo: Numeri casuali

Salve a tutti cercando di svolgere un esercizio non riesco a risolvere 
un problema: la generazione di un intero casuale. Devo definire un array 
di 20 elementi dichiarato cosi':
     	typedef struct {
	   int chiave;
	} elemento;
dove il campo chiave deve contenere un valore casuale. Il problema e' 
che mi mette sempre lo stesso valore. Vi posto il codice del mio prog 
cosi' se qualcuno ha un attimo di tempo magari mi dice dove sto sbagliando.
/*         -raccolta_chiavi.c-         */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int intero_random();
int main () {
   int i;
   int key;
   typedef struct {
     int chiave;
     char valore[20];
   }elemento;
   elemento pippo[20];
   for (i=0; i < 20; i++) {
     key = intero_random();
     pippo[i].chiave = key;
     printf("\nindice: %3d;  chiave: %5d\n", i,key);
   }
     return 0;
}
int intero_random() {
   int n,m;
   /* setta casualmente l'origine della sequenza */
   srand(time(0));
   /* la funzione random() restituisce un intero fra 0 e RAND_MAX, che e'
      una costante definita in stdlib.h */
   n=random();
   srand(time(0));
   /* per avere un intero casuale fra 0 e 5 */
   m=n%6;
   return m;
}
e questo e' l'output su Linux Mandrake 9.2 dopo aver compilato con gcc 3.3
indice: 0; chiave:  4
indice: 1; chiave:  4
.....................
indice: 19; chiave: 4
Grazie in anticipo e scusate la banalita' del problema ma non sono 
riuscito a trovare nessuna soluzione nel mio testo (Al Kelley & Ira Pohl).
-- 
"Knowing is not enough,
  we must apply.
  Willing is not enough,
  we must do." Bruce Lee.

 un problema: la generazione di un intero casuale.
L' istruzione
srand (time(NULL));
induce il PC a leggere il suo orologio interno.
La funzione "time", infatti, restituisce l'ora corrente del giorno 
espressa in secondi.
Tale valore, convertito in un intero unsigned, č utilizzato dalla 
"srand" per inseminare la "rand".
Se ho ben capito qual'č il tuo problema:
   int n = 5; // per avere un intervallo compreso tra 0 e 5.
   srand (time(NULL)); // La srand viene invocata, prima del for.
   for (i=1; i<20; i++)
     {
       key = rand () % n; // La rand e' ora inseminata.
       pippo[c].chiave = key; // La chiave č assegnata.
       printf("\nindice: %3d;  chiave: %5d\n", i,key);
     }
Spero di esserti stato utile.
Marcello

Marcello ha scritto:
[...]
Grazie Marcello ora il progr funziona, ma prima non andava perche' 
l'istruzione srand(time(NULL)) era inserita nella funzione 
intero_casuale() ???
Non posso quindi crearmi una funzione che genera numeri casuali su 
richiesta?
Ciao e grazie, Fist.


 richiesta?
Si', puoi avere numeri casuali "su richiesta" (e cosa volevi averli, a 
tiramento del programma? :P)
il punto e' che srand inizializza il generatore di numeri casuali (con 
un seme). Ergo, lo devi fare una volta all'inizio del programma, 
dopodiche' e' gia' inizializzato e chiami solo la random.
Cmq, bastava dare un'occhiata ad uno dei diecimila esempi che puoi 
trovare in rete! :P
-- 
/**
  * Mattia Belletti - Undergraduate student @ 
cs.unibo.it
  * ICQ: 33292311   - email: 
mbel...@cs.unibo.it
  * IRC: BluShine   - site(s): 
http://cs.unibo.it/~mbellett
  * Linux registered user 299762 @ Linux registered machine 213003
  */

 Ciao e grazie, Fist.
Di nulla.
Marcello