srand
es una función que "siembra" el generador de números aleatorios. En caso de que no lo sepas, los números aleatorios en las computadoras no son realmente aleatorios. En efecto, la computadora solo tiene una lista de números que parecen aleatorios, y usted usa srand
para decirle dónde comenzar en esa lista, con cada llamada a rand()
devolviendo el siguiente elemento en la lista.
La razón por la que escribe srand(time(NULL))
es obtener los números aleatorios para comenzar en algún punto que no va a ser el mismo cada vez que ejecuta el programa (a menos que los programas comiencen al mismo tiempo).
Entonces, lo que está haciendo aquí es decirle repetidamente al programa que reinicie la lista de números aleatorios en el mismo punto (porque la hora es la misma cada vez que pasa por el ciclo). Mueva la llamada al srand
fuera del bucle y obtendrá los resultados correctos.
Su primera llamada 'calloc' debería ser' sizeof (int *) 'pero parece estar funcionando en un host en punteros y enteros simples son del mismo tamaño (eso es cierto para la mayoría de las arquitecturas). – mpez0