Generare numeri casuali diversi ogni volta

di il
2 risposte

Generare numeri casuali diversi ogni volta

Ciao! Devo risolvere questo esercizio: due processi figli devono generare in maniera random un numero compreso nell'intervallo [1-6] e scrivere il risultato in una pipe. Per i due processi si usano due pipe distinte. La funzione utilizzata dai due processi è la stessa e gli vengono passati come parametri la pipe p[] e il numero di interi n che deve generare.
void giocatore(int p[],int n)  
  {	
	int j;
	int x;

    // generazione di N valori casuali e scrittura nella pipe p passata come parametro
	close(p[READ]);
	srand(time(NULL));
	for(j=0;j<n;j++) {
		x=rand()%6+1;
		write(p[WRITE],&x,sizeof(int));
	}
	close(p[WRITE]);
 }
Nel main creo i due processi e leggo le giocate (che sono n)
p1=fork();
	if(p1==0) {
		giocatore(p1p0,n);       // p1p0 è la pipe dal processo figlio 1 al padre
		exit(0);
	}
	
	p2=fork();
	if(p2==0) {
		giocatore(p2p0,n);      // p1p0 è la pipe dal processo figlio 1 al padre
		exit(0);
	}	

  // Lettura degli N  lanci dai figli
	for (i=0;i<n;i++) {
		printf("\n-----LANCIO %d-----\n", i+1);
		read(p1p0[READ],&num1,sizeof(int));
		printf("Il giocatore 1 ha fatto %d\n", num1);
		read(p2p0[READ],&num2,sizeof(int));
		printf("Il giocatore 2 ha fatto %d\n", num2);
		sleep(2);
	}
Il problema è che per ogni giocata i due processi generano sempre lo stesso intero, che cambia di giocata in giocata però è lo stesso per ogni singolo lancio per i due processi. Credo che dipenda dalla funzione giocatore e dall'utilizzo delle funzioni srand e rand. Come faccio a generare due numeri diversi per ogni giocata per ogni processo? Grazie!

2 Risposte

  • Re: Generare numeri casuali diversi ogni volta

    Ciao, ammetto di non aver letto tutto il codice, ma forse non è nemmeno necessario. Quello di generare numeri random diversi è un problema ben noto, e una possibile soluzione è la seguente:
    - prepari un array contenente gli N numeri tra i quali vuoi estrarre
    - sorteggi un numero compreso tra 0 e N-1 e lo chiami, ad esempio, "index"
    - il numero che prendi è l'elemento dell'array in posizione "index"
    - prendi l'ultimo elemento dell'array (quello in posizione N-1) e lo metti in posizione "index", al posto di quello che è già stato estratto
    - sorteggi un nuovo indice, che questa volta andrà da 0 a N-2 (perché hai un posto "vuoto" in coda), e lo chiami nuovamente "index"
    - il nuovo numero sorteggiato è l'elemento dell'array in posizione "index", e hai la garanzia che sia diverso dal precedente
    - ripeti finché vuoi

  • Re: Generare numeri casuali diversi ogni volta

    Time() restituisce il tempo in base ai secondi, i due processi vengono comn molta probabilità eseguiti nello stesso secondo e quindi il seme dei due processi è identico restituendo gli stessi numeri.
    dopo aver creato il primo processo metti in pausa almeno un secondo e poi crea il secondo processo
Devi accedere o registrarti per scrivere nel forum
2 risposte