Dunque, ho spulciato un po' in giro, e apparentemente il problema sta nella CRT Microsoft (che MinGW sfrutta per un po' di roba, tra cui appunto la srand/rand). Per come è implementata la srand nel runtime Microsoft, il primo numero generato da rand() ha una dipendenza molto stretta dal seed; stampando semplicemente il primo valore restituito da rand() in run successive (=> i seed differiscono solo di 1) ottengo
e non siamo i primi a notare il problema. Dato che il primo metodo rimappa in maniera lineare il range della rand sul range desiderato, questa scarsa casualità del primo estratto si nota anche sul numero che ne derivi (mentre è "nascosta" dal modulo nel secondo metodo).codice:27250 27253 27256 27260 27263
Ergo, puoi fare due cose:
- scartare il risultato della prima rand(), visto che dalle successive va avanti giusto;
- come suggerisce brancomat, puoi recuperare un altro generatore di numeri casuali; se ti basta un LCG puoi rubacchiare una qualunque implementazione più robusta (già quella di glibc è molto meglio - tra l'altro, ha un RAND_MAX molto più alto e un periodo molto più lungo rispetto a quello della CRT Microsoft), oppure, se hai necessità di numeri casuali "di alta qualità", puoi tirare fuori le armi pesanti e usare, ad esempio, il classico Mersenne Twister (si trovano diverse implementazioni free in giro).