Si pongo este código en el evento CREATE se crean 5 pelotas en posiciones aleatorias:

for (i = 1; i <= 5; i += 1)
{   
    instance_create(random(400),random(400),obj_pelota);
}


Pero si pongo este otro, solo se crea una. Osea, que las variables durante el ciclo FOR tienen el mismo valor:

a = random(400);
b = random(400);

for (i = 1; i <= 5; i += 1)
{   
    instance_create(a,b,obj_pelota);
}


¿Durante cada paso del ciclo no se debería actualizar la variable 'a' y 'b' con otro valor 'random'?

Ten en cuenta que lo que primero se hace es crear las variables en el segundo código, y despues empieza el bucle. En el primero lo que hace es crear las variables 5 veces (una por bucle) en lugares aleatorios.

No, en el segundo código no se actualizan las variables. Pero es por el simple orden en el que está hecho. Si quieres que se actualizen, tienes que declararlas dentro del bucle. Hay dos maneras de hacerlo.


for (i = 1; i <= 5; i += 1)

    a = random(400);
    b = random(400);
    instance_create(a,b,obj_pelota);
}


for (i = 1; i <= 5; i += 1)
{   
    instance_create(random(400),random(400),obj_pelota);
}



Pues entonces no le veo ningún sentido. Lo suyo es declarar fuera del bucle y que dentro de este, pongamos las variables. No le veo el sentido declarar dentro y encima meter las variables. Para mí es una redundancia de código.

Tengo que mirar en otro lenguaje a ver si esto sucede igual. Es decir, si al declarar fuera de un bucle, el ciclo FOR actualiza variables dentro de un bloque. No me refiero a la propia de control del ciclo. Osea, la que lleva la cuenta de cuantas veces se repite ese bloque de instrucciones.

Cogeremos tu código.

a = random(400);
b = random(400);

for (i = 1; i <= 5; i += 1)
{   
    instance_create(a,b,obj_pelota);
}


El problema es que cuando las declaras fuera, lo que estas diciendo es que a la variable A y B se les asigna un valor random, de maximo 400. En el momento en el que las declaras ya tienen un valor.

Despues empieza el bucle, en el cual lo unico que hace es crear el objeto 5 veces. La variable A y B no cambian por que ya las has declarado.

Una forma mas legible de lo que intento decir, es que en este código lo que pasa es esto.

a = random(400);
b = random(400);
instance_create(a,b,obj_pelota);
instance_create(a,b,obj_pelota);
instance_create(a,b,obj_pelota);
instance_create(a,b,obj_pelota);
instance_create(a,b,obj_pelota);


Si lo que quieres es que salgan 5 pelotas en posiciones aleatorias, tienes que cambiar la variable A y B entre bucle y bucle. Esto solo puedes hacerlo dentro del bucle en sí. En el bucle lo que tendría que pasar es esto.

a = random(400);
b = random(400);
instance_create(a,b,obj_pelota);
a = random(400);
b = random(400);
instance_create(a,b,obj_pelota);
a = random(400);
b = random(400);
instance_create(a,b,obj_pelota);
a = random(400);
b = random(400);
instance_create(a,b,obj_pelota);
a = random(400);
b = random(400);
instance_create(a,b,obj_pelota);


Estos ejemplos de código es solo para que sea mas entendible lo que quiero decir. Si declaras fuera del bucle, lo unico que haces es coger lo declarado fuera del bucle 5 veces. Y esto pasa en C++, te aviso por si acaso.