Nessuna sequenza generata attraverso un algoritmo e quindi attraverso un computer può veramente definirsi casuale. Pertanto potremmo limitarci a dire che possiamo generare solo sequenze di numeri pseudorandom, ovvero numeri che sembrino apparentemente casuali.
Inizioamo con un pò di teoria:
Una sequenza pseudorandom è costituita da una successione di valori x[j], nel quale i primi k valori x[0], x[1], ..., x[k-1] sono scelti in modo da essere difficilmente prevedibili, e ciascuno dei successivi x[j], j>=k, è ottenuto applicando una funzione F sui k precedenti valori x[j-1], x[j-2], ..., x[j-k].
La sequenza x[0], x[1], ..., x[k-1] dei primi k valori prende il nome di seme della sequenza.
Naturalmente l'intera sequenza dei numeri generati dipende dal valore del seme.
Un generatore pseudorandom si considera buono se il suo output segue bene una certa distribuzione, ovvero quella uniforme.
In genere per la generazione di sequenze di numeri casuali ci si affida ad un generatore congruenziale lineare della forma:
x[j+1] = (a*x[j] + b) mod m

Nel linguaggio C ci sono tra le varie funzioni di generazione di numeri pseudocasuali due funzioni in particolare della libreria standard quali:
-rand(): genera un numero casuale uniformemente distribuito tra 0 e RAND_MAX che in genere ha valore 32767;
-srand(): che consente di stabilire un seme iniziale alla sequenza di numeri casuali (in genere, se omesso è pari a 1);

Il modo più intuitivo, ma che risulta anche scorretto, per generare numeri casuali è il seguente:
num_cas = rand() % N;
Che consente di generare un intero < N. Questo metodo è scorretto per 2 motivi:
1)Num_cas viene generato considerando solo le cifre meno significative del numero generato da rand(). Per risolvere tale problema si può ricorrere alla precisione del sistema Floating Point in virgola mobile. Pertanto per generare un numero casuale si può procedere in questo modo:

num_cas = (int) (50.0*rand()/RAND_MAX);

Analizziamo la sintassi:
-50.0: rappresenta N (si ricordi rand() % N;), si noti che il numero è rappresentato attraverso la precisione del sistema F.P. e consente (attraverso i cast impliciti del linguaggio C) di convertitre gli altri valori dell'espressioni in float (o double);
-(int): converte il numero casuale generato in int.

2)Il secondo problema riguarda l'uniformità della distribuzione, in quanto il metodo appena utilizzato non la garantisce.
Per affrontare questo problema si può tenere presente che:
Siano n e k due numeri interi non negativi: esistono esattamente due numeri q ed r tali che n=kq+r e 0<=r<k; se n e k sono variabili di tipo int, allora q è n/k ed r è n%k.
Ne segue che il più grande intero divisibile per N che non supera RAND_MAX, è ((RAND_MAX)/N)*N.
Pertanto il tutto consiste nel determinare n_max come il massimo intero divisibile per N che non supera RAND_MAX e utilizzare a rand() per generare un numero casuale che non superi n_max.

Per maggiori informazioni si consulti il testo
D.E. Knuth, The Art of computer programming - Volume 2: Seminumerical Algorithm.