[C] Problemi con long long int
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:
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?

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
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.
Non vedo il codice in cui stampi a in ogni caso.
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
Grazie del chiarimento

Potresti "riempire" un long long con più chiamate a rand():
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:
L'alternativa seria è quella di usare una libreria esterna. In C++ userei Boost, in C non saprei.
#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.
Credo che l'implementazione originale del mersenne twister (e delle sue varianti più recenti) si in C...