Página 1 de 1
Como gerar números ou instancias que não se repetem?
Enviado: Qua Set 14, 2016 8:24 pm
por gustavo12g
Olá pessoal...
Minha dúvida: Quero realizar um sorteio de números ou instancias. Mas quero que apareçam apenas uma vez, que não se repitam até que o último número ou instancia aparecer.
Por ex: (1,2,3,4,5,6).
Se eu usar por ex o CHOOSE, o número 1 poderia se repetir antes que todos os outros fossem sorteados.
Gostaria que cada um que fosse sorteado, só voltasse a ser quando todos os outros já tenham sidos.
Alguém poderia me ajudar?
Re: Como gerar números ou instancias que não se repetem?
Enviado: Qua Set 14, 2016 8:37 pm
por Superbomber
Ou seja, você quer uma ordem aleatória.(em JS isso seria tão simples...)
Não sei se existe um "sort" aleatório no GMS, mas pode fazer isso usando ds_list e verificando se o item já foi inserido na list.
Exemplo:
Código: Selecionar todos
i = 0;
itens = ds_list_create();
while( i < 3 ){
atu = choose(inst1, inst2, inst3);
if( ds_list_find_index(itens, atu) == -1){ // se ainda não foi inserido na list
ds_list_add(itens, atu);
i++;
}
}
Veja a lógica e faça seu próprio código, estou em um Tablet pode haver erros.
Bye.

Re: Como gerar números ou instancias que não se repetem?
Enviado: Qua Set 14, 2016 9:27 pm
por gustavo12g
Ele está sempre repetindo o mesmo resultado. Quando sorteia o inst2, por ex, fica só nele.
Re: Como gerar números ou instancias que não se repetem?
Enviado: Qua Set 14, 2016 9:53 pm
por Superbomber
Como você colocou o código?
No if você botou == -1? Porque se você colocar != o resultado vai ser o descrito por você.
Se puder mostrar o código usado...
Re: Como gerar números ou instancias que não se repetem?
Enviado: Qua Set 14, 2016 9:54 pm
por Denis Lemos
Você pode criar uma
DS List, e ir adicionando os itens ou valores em ordem crescente ou na ordem que vc preferir.
Depois você pode apenas usar
ds_list_shuffle()
Isso embaralha os itens da lista em ordem aleatória e eles não se repetem. Depois basta apenas checar a lista de item a item até que apareça o item que você precisa.
Sobre vc obter o mesmo resultado, é porque o GM:s usa sempre o mesmo "seed" para gerar números aleatórios. Para mudar isso, vc precisa apenas chamar o comando
randomize() no "Create" do objeto, isso vai definir a semente para um valor aleatório.
Re: Como gerar números ou instancias que não se repetem?
Enviado: Qua Set 14, 2016 10:34 pm
por gustavo12g
Eu tinha esse código:
OBJ CRIAR
create: alarm[0]=10
Alarm[0]
s=choose(1,2,3,4,5)
if s=1 {instance_create(100,50,p1); alarm[1]=60 }
if s=2 {instance_create(150,70,p2); alarm[1]=60}
if s=3 {instance_create(180,80,p3); alarm[1]=60}
if s=4 {instance_create(200,90,p4); alarm[1]=60}
if s=5 {instance_create(300,100,p5); alarm[1]=60}
Alarm[1]
s=choose(1,2,3,4,5)
if s=1 {instance_create(100,50,p1); alarm[0]=60 }
if s=2 {instance_create(150,70,p2); alarm[0]=60}
if s=3 {instance_create(180,80,p3); alarm[0]=60}
if s=4 {instance_create(200,90,p4); alarm[0]=60}
if s=5 {instance_create(300,100,p5); alarm[0]=60}
Isso ia criando os aleatórios mas eles se repetiam mesmo antes de todos aparecerem.
Por ex: sorteava o p3, logo depois sorteava o p3 de novo. Ou sorteava o p2, depois o p1, e mesmo antes do p4 e p5 aparecerem voltava a sortear o p2.
Meu desejo é que todos sejam sorteados antes que se repitam.
Re: Como gerar números ou instancias que não se repetem? Tópico resolvido
Enviado: Qui Set 15, 2016 1:14 am
por Denis Lemos
Por isso eu disse para vc guardar os objetos em uma lista, embaralhar a lista, e usar os valores da lista na ordem normal crescente.
Ex:
Crie um obj_controle e coloque isso no
Evento Create:
Código: Selecionar todos
//Randomizando a semente usada para gerar números aleatórios.
randomize();
//Criando a nossa lista.
myList = ds_list_create();
/*Adicionando os objetos na nossa lista. Note que os objetos são
adicionados em ordem crescente, mas isso não vai fazer diferença no final.*/
ds_list_add(myList, obj_1);
ds_list_add(myList, obj_2);
ds_list_add(myList, obj_3);
ds_list_add(myList, obj_4);
ds_list_add(myList, obj_5);
/*Misturando os objetos da nossa lista em ordem aleatória.
Note que agora os objetos não estão mais ordenados como antes, estão agora em posições aleatórias.*/
ds_list_shuffle(myList);
//Chamando o alarm0 depois de 1 segundo.
alarm[0] = 1 * room_speed;
No
Alarm[0] coloque isso:
Código: Selecionar todos
/*Criando o primeiro item da lista que está posicionado no índice 0.
Note que não sabemos qual é o objeto, pois ele foi definido randomicamente.*/
myInstance = ds_list_find_value(myList, 0);//Captura o primeiro item da lista.
instance_create(x + 34,y,myInstance);
//Chamando o alarm1 depois de 2 segundos.
alarm[1] = 2 * room_speed;
No
Alarm[1] coloque isso:
Código: Selecionar todos
//Criando o segundo item da lista que se encontra no índice 1.
myInstance = ds_list_find_value(myList, 1);
instance_create(x + (34 * 2),y,myInstance);
//Chamando o alarm2 depois de 2 segundos.
alarm[2] = 2 * room_speed;
No
Alarm[2] coloque isso:
Código: Selecionar todos
//Criando o terceiro item da lista localizado no índice 2.
myInstance = ds_list_find_value(myList, 2);
instance_create(x + (34 * 3),y,myInstance);
//Chamando o alarm3 depois de 2 segundos.
alarm[3] = 2 * room_speed;
No
Alarm[3] coloque isso:
Código: Selecionar todos
//Criando o quarto item da lista localizado no índice 3.
myInstance = ds_list_find_value(myList, 3);
instance_create(x + (34 * 4),y,myInstance);
//Chamando o alarm4 depois de 2 segundos.
alarm[4] = 2 * room_speed;
E por fim no
Alarm[4] coloque isso:
Código: Selecionar todos
//Criando o quinto item da lista localizado no índice 4.
myInstance = ds_list_find_value(myList, 4);
instance_create(x + (34 * 5),y,myInstance);
Viu que apenas a lista foi misturada, mudando a ordem que os objetos estão localizados nela? O código para criar os objetos é o mesmo, e sempre na mesma ordem, só o que muda é a ordem dos itens na lista.
- Primeiro é criado o item1 da lista.
- Depois é criado o item2 da lista.
- Depois é criado o item3 da lista.
- Depois é criado o item4 da lista.
- Depois é criado o item5 da lista.
Re: Como gerar números ou instancias que não se repetem?
Enviado: Sex Set 16, 2016 3:36 pm
por gustavo12g
Muito obrigado!!!