cPor qué no pruebas a correr el código que expuse?.
Porque eso es lo peor que se puede hacer en este escenario. C no es un lenguaje con "rueditas" y debido a sus reglas "tasajear" código para en base al resultado sacar conclusiones no es una buena idea. Lo explico mas adelante.
¿No será que "quieres decir otra cosa?
No, estas leyendo de mas en mis mensajes.
porque decir que no "funciona" cuando sí funciona es erróneo.
Cuando se trata del lenguaje C y sus estándares hay que ser muy cuidadoso con el lenguaje (con el otro, me refiero al español).
Yo no dije que en tu caso el programa no funcione correctamente, eso lo podemos dar por un hecho. Yo indique que es un error. Voy a explicar con mas detalle.
El estándar de C define el lenguaje y el comportamiento que tendrán los programas desarrollados con el pero,
si se viola una de sus reglas, se genera "comportamiento no definido". Si revisamos uno de los últimos borradores (N1124) del estándar C99 tenemos:
6.5.2.2 Function calls
[...]
2 If the expression that denotes the called function has a type that includes a prototype, the number of arguments shall agree with the number of parameters.
[...]
6 If the expression that denotes the called function has a type that does not include a prototype, the integer promotions are performed on each argument, and arguments that have type float are promoted to double. These are called the default argument promotions. If the number of arguments does not equal the number of parameters, the behavior is undefined.
En base a esa parte podemos concluir que, si se llama a la función "srand" sin argumentos cuando su prototipo (cortesía de <stdlib.h>) indica que se debe pasar uno, se genera comportamiento no definido.
¿Porque es un error? Porque, como su nombre sugiere, una vez se genere el comportamiento no definido (en nuestro caso con la llamada a "srand")
ya no hay garantías sobre el comportamiento del programa.
Cualquier cosa puede pasar, por ejemplo el programa:
* Funciona correctamente.
* Genera resultados inesperados.
* Simplemente revienta.
* etc.
Y ese es el problema: el compilador se "lava las manos" y lo que sea que resulte del programa es
responsabilidad de programador (por violar las reglas del lenguaje).
Otro ejemplo, por desgracia común, es el uso de "fflush(stdin)". El estándar define el comportamiento de la función pero
solo para streams de salida. Si se trata de un stream de entrada (como es el caso de "stdin") y como el estándar no define el comportamiento en ese caso se genera ...
Pero te recuerdo que la duda era otra, ésta en concreto:
Respuesta a:EDITO 2: Me surge otra pregunta, utilizar srand() sin semilla y srand() pero con una semilla que no cambie, es realmente lo mismo no?
SI, puedes ponerla sin semilla así "srand()" o con semilla, así "srand(15)" y en ambos casos se genera el mismo juego de números aleatorios.Espero ahora se entienda mejor: utilizar "srand()" es un error ya que no se puede garantizar el comportamiento del programa a partir de ese punto.
Un saludo