Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [C] numeri random tutti diversi

    Ciao,
    devo generare, in parallelo su più macchine, un file contenente coppie di numeri casuali.
    codice:
    void number_generator() {
    	FILE *fd = NULL;
    	int k;
    	char toOrder[15] = "casual.txt";
    		
    	if ( (fd = fopen(toOrder, "w")) == NULL) {
    		printf("errore di apertura %s\n", casual);
    		return;
    	}
    	srand(time(0));
    	for (k=0; k<N_MAX; k++)
    		fprintf(fd, "<%d,%d>\n", rand(), rand());
    	fclose(fd);
    }
    In questo modo srand inizializza la generazione dei numeri al secondo corrente...se non mi sbaglio...ma in questo modo potrei avere coppie duplicate su vari pc, quello che voglio è che non ci siano coppie uguali.
    Non cè un altro modo di inizializzare con srand che mi permetta di avere diverse distribuzioni di numeri casuali?

    tipo: srand("tempo in millisencodi")?

    Esiste inoltre un modo x settare il numero massimo generabile?
    grazie.
    ciao.

  2. #2
    Utente di HTML.it L'avatar di netarrow
    Registrato dal
    Apr 2004
    Messaggi
    1,425
    se sei su windows prova l'api QueryPerformanceFrequency, su linux gettimeofday di sys/time.h.

    Per il numero massimo e minimo puoi fare:

    FraMinAndMax = min + rand() % max

    estrami esclusi.
    Inoltre in una copia cache sperduta di google ho trovato queste due funzioni:

    codice:
    #include <stdlib.h>
    
    
    int int_rand(int,int) // generatore di numeri casuali di tipo intero
    
    double doub_rand(double,double) // generatore di numeri casuali di tipo double
    
    
    int int_rand(int min,int max)
    {int numero_casuale;
     int differenza;
     differenza = (max - min) + 1;
     numero_casuale = rand() % differenza ;
     numero_casuale = numero_casuale + min ;
     return numero_casuale;
    }
    
    double doub_rand(double min,double max)
    {double numero_casuale,differenza;
     differenza = (max - min);
     numero_casuale = (rand()/RAND_MAX) * differenza;
     numero_casuale += min ;
     return doub_casuale;
    }
    Imparare è un'esperienza, tutto il resto è solo informazione. (Albert Einstein)

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2003
    Messaggi
    423
    Per il numero massimo e minimo puoi fare:
    FraMinAndMax = min + rand() % max
    Piccolo appunto.
    La sintassi esatta è
    codice:
    FraMinAndMax = min + rand() % (max - min)

  4. #4

    Re: [C] numeri random tutti diversi

    Originariamente inviato da nrocco
    Non cè un altro modo di inizializzare con srand che mi permetta di avere diverse distribuzioni di numeri casuali?

    tipo: srand("tempo in millisencodi")?

    x questo come faccio?

  5. #5
    Utente di HTML.it L'avatar di netarrow
    Registrato dal
    Apr 2004
    Messaggi
    1,425
    appunto, il risultato dell'API lo passi a srand, fai un cast perderai un pò di precisione.
    Sennò prova ad usare la funzione clock() di time.h, il cui ritorno è espresso in unità di impulsi del processore, un dato che cmq è abbastanza casuale per inizializzare srand; sennò lo converti in millisecondi(dentro il file h c'è solo una macro per convertire in secondi).
    Per trovare i millisecondi in maniera diretta non conosco nessuna funzione.
    Certo c'è time(NULL) sempre di time.h che ti ritorna il tempo trascorso da 00:00 Gen 1 1970 in secondi, ma in millisecondi diretti non conosco, dovresti sempre convertire perdendo precisione. A meno che tu non riesca a sfasare di 1 sec la generazione del numero sulla macchina.
    Imparare è un'esperienza, tutto il resto è solo informazione. (Albert Einstein)

  6. #6
    ho risolto inizializzando srand con: rank+time(0)

    dove rank, per chi non fosse pratico, è l'id del pc ch esegue il codice in parallelo.

    Grazie cmq a tutti!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.