Cita de: Goganpis en Agosto 03, 2019, 01:06:06 AMEl único problema que tiene este algoritmo es que, la instrucción mas importante:
Bueno Yo lo haria de esta forma...Código [Seleccionar]var tanteo, maxObj, Lista, ListaMax;
maxObj = 2; // Numero de repeticiones (numero maximo de objetos tanteados)
ListaMax = 10; // Espacio de la lista
var i;
for(i=0;i<ListaMax;i+=1)
{// Vaciar Lista
Lista[i] = 0;
}
var i;
for (i=0;i<maxObj;i+=1) // Repetir el ciclo hasta llegar al limite de objetos en este caso "3"
{// Tantear maxObj que tienen que ser ajustados
tanteo = irandom(ListaMax); // Aleatoriedad del tanteo a elegir
Lista[tanteo] = 1; // Ajustar como creado o elegido como lo llames
}
PD: Ya el array Lista tiene que ser declarado anteriormente o dara error otra opcion seria usar ds_list.
[gml]
tanteo = irandom(ListaMax); // Aleatoriedad del tanteo a elegir
[/gml]
Podría dar un numero repetido y el ciclo contaría de todas maneras la iteración. En el peor de los casos se dará para un elemento repetido y no habrán 3 elementos seleccionado sino 2 o para peor, solo 1.
Lo que cabría hacer es, verificar, que el número que saca "tanteo" no está repetido.
[gml]
tanteo = irandom(ListaMax); // Aleatoriedad del tanteo a elegir
if (lista[tanteo] == 0)
lista[tanteo] = 1;
else
i -= 1; //repetir el ciclo restando -1, para decir que no cuente esta vuelta. (Aclaro que esto para mi desde un punto estructural siguiendo el paradigma de programacion estructurada, esta super mal XD )
[/gml]
El problema con este algoritmo es, lo que se llama "aplazamiento indefinido", que en el peor de los casos cae siempre en un espacio ocupado y se repite innecesariamente muchas iteracion.
Por lo que:
Citarcual seria la manera mas eficiente [...]No es la mejor manera, pero sigue siendo una solución corta de implementar. <3