[C] Problemi con long long int

Alina81
Salve a tutti! :)
In un pezzo del mio codice ho bisogno di cercare un numero random tra 2 ed n e ho bisogno di lavorare con dei numeri molto grandi (perché devo calcolare una potenza modulare). Il codice è il seguente:
long long int n, n_step, a, i;

srand(time(NULL));

for(i=1;i<n_step;){

            a = rand() % (n-2) + 2;
}

Quando chiedo di stampare i valori di a ad ogni ciclo, a risulta sempre 0. Non succede se uso solo int. Perché? Come posso risovere questo problema?

Risposte
vict85
Considerando che rand genera un valore casuale tra 0 e RAND_MAX <= INT_MAX che potrebbe essere strettamente più piccolo del valore di un long long int direi che il problema del tuo codice è che se hai bisogno di numeri casuali grandi non puoi semplicemente usare rand. Se vuoi usare rand allora non hai ragione di usare qualcosa di più grande di un int.

Non vedo il codice in cui stampi a in ogni caso.

Alina81
Sì ho omesso la printf. Ora mi è chiaro l'errore, ma, dato che dovrei usare numeri grandi, al posto di rand() c'è qualche altra funzione?
Grazie del chiarimento :)

Emar1

claudio862
Potresti "riempire" un long long con più chiamate a rand():

#include <cstdlib>

typedef long long Type;

Type lrand()
{
    Type result = 0;
    for (unsigned long long i = 0; i < sizeof(Type)/sizeof(int); ++i) {
        result |= rand() << (i * CHAR_BIT*sizeof(int));
    }

    return result;
}


In realtà non funziona granché bene perché, come ha detto vict85, rand() restituisce un numero minore o uguale a RAND_MAX, che potrebbe essere più piccolo di sizeof(int) (sul mio computer infatti è così), quindi molti bit di result restano a zero. Potresti sostituire sizeof(int) con il numero di "byte" relativo a RAND_MAX:

#include <cstdlib>

typedef long long Type;

Type lrand()
{
    Type sizeof_RAND_MAX = 2;
    Type result = 0;
    for (unsigned long long i = 0; i < sizeof(Type)/sizeof_RAND_MAX; ++i) {
        result |= rand() << (i * CHAR_BIT*sizeof_RAND_MAX);
    }

    return result;
}


L'alternativa seria è quella di usare una libreria esterna. In C++ userei Boost, in C non saprei.

apatriarca
Credo che l'implementazione originale del mersenne twister (e delle sue varianti più recenti) si in C...

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.