Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12

Discussione: [C] Random e Liste

  1. #1

    Random e Liste C

    Ciao, ho scritto un programma nel quale mi serviva creare dei numeri in modo random.
    Io ho scritto:

    int n;
    n = rand()%80000+1;

    volendo generare un numero compreso tra 1 ed 80000 (giusto?)

    Il fatto è che io devo generare almeno 100000 di questi numeri (anche ripetendoli) e quindi ho inserito quell'istruzione in un ciclo while(k!=100000) inizializzando k a zero.

    Ogni volta che genero un nuovo numero lo inserisco in una lista di interi per tenere memoria solo dei numeri che sono tutti diversi. Qui ho il problema: nonostante genero 100000 numeri compresi tra 1 e 80000 alla fine mi ritrovo sempre con 32768 numeri diversi, non uno di più.
    A cosa è dovuto??
    Perchè non ne genera altri??

    Vi ringrazio per l'aiuto.

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254

    Re: Random e Liste C

    Originariamente inviato da Tempestaxmen
    Qui ho il problema: nonostante genero 100000 numeri compresi tra 1 e 80000 alla fine mi ritrovo sempre con 32768 numeri diversi, non uno di più.
    A cosa è dovuto??
    Perchè non ne genera altri??
    Il range dei valori ottenibili da rand() dipende da come è stata implementata la funzione rand() nella libreria di uno specifico compilatore.

    Sul Visual C++, RAND_MAX vale 0x7fff (32767). Stessa cosa per il Dev-C++.
    Su Linux invece la libreria fornisce una rand() che genera valori fino a 2147483647. Il valore RAND_MAX è dichiarato in stdlib.h.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #3
    Io sto utilizzando il Dev-C++...
    ma allora non c'è modo di generare un numero maggiore di elementi?

  4. #4
    Originariamente inviato da Tempestaxmen
    Io sto utilizzando il Dev-C++...
    ma allora non c'è modo di generare un numero maggiore di elementi?
    guarda non dire se sia lecito farlo, pero' AndBind ti ha dato un suggerimento implicito:

    se editi il file stdlib.h trovarai una riga con scritto
    codice:
    /*
     * RAND_MAX is the maximum value that may be returned by rand.
     * The minimum is zero.
     */
    #define	RAND_MAX	0x7FFF
    
    /*
     * These values may be used as exit status codes.
     */
    se vuoi aumentare il valore del rand basta che cambi il valore di rand_max anke se, ripeto, non se sia lecito farlo. per es se vuoi numeri fino a 100000 devi impostare il valore 0x186A0 (che e' il suo equivalente in esadecimale, almeno secondo la calcolatrice....)

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Originariamente inviato da UltraBeginner
    se vuoi aumentare il valore del rand basta che cambi il valore di rand_max anke se, ripeto, non se sia lecito farlo. per es se vuoi numeri fino a 100000 devi impostare il valore 0x186A0 (che e' il suo equivalente in esadecimale, almeno secondo la calcolatrice....)
    Ma no assolutamente!!!! Cambiare quella define non porta ad avere un range diverso.
    La funzione rand() è stata studiata, implementata e quindi compilata nella libreria "standard" in un certo modo. Cambiare quella define non cambia il comportamento della rand().

    Bisognerebbe esaminare il sorgente della funzione rand(), modificarlo e poi ricompilare la libreria "standard" del compilatore.

    Ad esempio nel sorgente rand.c del VC++, non viene nemmeno usata la macro RAND_MAX. Viene fatto di brutto un AND con 0x7fff del valore ritornato.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  6. #6
    Ma allora si può modificare rand() e poi ricompilare la libreria standard??
    A me servirebbe arrivare ad ottenere almeno 100000 numeri

  7. #7
    Originariamente inviato da andbin
    Ma no assolutamente!!!! Cambiare quella define non porta ad avere un range diverso.
    La funzione rand() è stata studiata, implementata e quindi compilata nella libreria "standard" in un certo modo. Cambiare quella define non cambia il comportamento della rand().

    Bisognerebbe esaminare il sorgente della funzione rand(), modificarlo e poi ricompilare la libreria "standard" del compilatore.

    Ad esempio nel sorgente rand.c del VC++, non viene nemmeno usata la macro RAND_MAX. Viene fatto di brutto un AND con 0x7fff del valore ritornato.
    Cazziato e Mazziato Ergo, non si finisce mai di imparare

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Originariamente inviato da Tempestaxmen
    Ma allora si può modificare rand() e poi ricompilare la libreria standard??
    Dipende se hai tutti i sorgenti della libreria, se hai i file di progetto (o i Makefile) già pronti per poterla ricompilare, ecc...
    Io personalmente eviterei di ricompilare la libreria standard, anche se fosse possibile ....

    Originariamente inviato da Tempestaxmen
    A me servirebbe arrivare ad ottenere almeno 100000 numeri
    Ti conviene cercare in giro per la rete dei sorgenti validi per la generazione di numeri casuali. Purtroppo fare una buona funzione per la generazione di numeri casuali non è proprio banale ....
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  9. #9
    Utente di HTML.it L'avatar di Lak3d
    Registrato dal
    Aug 2006
    Messaggi
    1,035
    io sarò limitato ma non potevano generare (come in VB) un numero fra 0 e 1 che poi io moltiplicavo per il massimo del range che volevo ottenere?

  10. #10
    Ecco una possibile soluzione...
    codice:
    int nrand(int max)
    {
        if (max<=RAND_MAX)
            return rand()%max;
        else
            return (int)((double)rand()/(double)max*RAND_MAX);
    }
    max è, come si può intuire, il numero massimo che si vuole ottenere.
    Amaro C++, il gusto pieno dell'undefined behavior.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.