Como funciona o choose
Enviado: Sáb Jun 25, 2016 12:07 am
Só pra esclarecer, noutro tópico foi dito que:
Imagina uma situação, onde você tem 5 possíveis inimigos, que podem ser sorteados aleatoriamente pelo jogo, então podemos usar:
instance_create(x,y,choose(ob_inimigo1,ob_inimigo2,ob_inimigo3,ob_inimigo4,ob_inimigo5))
A chance de qualquer um desses objetos serem criados, é de 1 em 5, ou seja, se eu quiser que o ob_inimigo3 por exemplo, apareça, é necessário repetir pelo menos 5 vezes o sorteio.
Bom, já quando tem um choose, dentro de outro, assim (vou usar números pra ficar mais simples de entender):
var sorteio = choose(0,1,2,3,4,5,6,7,8,choose(9,10,11,12))
A chance dos números de 0 a 8 sair, é de 1 em 10, pois tem 10 elementos a serem sorteados, porém o número 9 por exemplo, precisa ser escolhido no primeiro sorteio, para então executar um novo sorteio com 4 possibilidades, multiplicando a dificuldade do sorteio do primeiro, que é 10, ou seja, 1 em 40, então os números do segundo choose se torna muito mais difícil de ocorrer, em um jogo por exemplo, isso pode ser intencional (como um inimigo mais raro, que não pode aparecer com a mesma frequência dos demais, ou itens, powerups etc), então, caso queira que haja a mesma chance entre os sorteios, tem que usar um array (como foi dito pelo Thyago, no mesmo tópico).
A segunda resposta é ainda mais absurda, fica subentendido que todas as funções (com argumentos variáveis???? ou não???) precisam ter 16 argumentos ou vai dar erro, não entendi mesmo, de fato todas as funções do Game Maker, só suportam 16 argumentos no máximo, mas as funções podem ter menos argumentos sim, sem que isso dê algum erro, salvo no caso que são argumentos indispensáveis, como o instance_create, que pede 3 informações: x, y e o objeto, dai não tem como não colocar uma delas, inclusive se criar um script, é possível coletar apenas 16 variáveis (através das variáveis argument0 até argument15).
Enfim é isso ai, só queria corrigir isso, me senti incomodado. Flw!
egabrielsch escreveu:Para complementar as respostas existe uma técnica que é adicionar um choose dentro de um choose, assim:Código: Selecionar todos
abc = choose(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, choose(15, 16, 17, 18, ...))
Ambas são respostas equivocadas, a primeira, pra falar algo assim, não pode ter conhecimento algum em probabilidade, quando você coloca um choose, dentro de outro, a chance dos eventos do segundo choose ficam desfavorecidas (salvo se o programador fizer isso propositalmente), vou explicar porque:Markito escreveu:Outro adendo, em GML todas as funções só suportam um máximo de 16 argumentos. Ter esse valor em mente cai mais em conta em funções de argumentos variáveis, como choose, mas o GM também vai dar wrong number of arguments nas funções com número de argumentos menor que 16, pois os argumentos foram declarados no banco de funções.
Imagina uma situação, onde você tem 5 possíveis inimigos, que podem ser sorteados aleatoriamente pelo jogo, então podemos usar:
instance_create(x,y,choose(ob_inimigo1,ob_inimigo2,ob_inimigo3,ob_inimigo4,ob_inimigo5))
A chance de qualquer um desses objetos serem criados, é de 1 em 5, ou seja, se eu quiser que o ob_inimigo3 por exemplo, apareça, é necessário repetir pelo menos 5 vezes o sorteio.
Bom, já quando tem um choose, dentro de outro, assim (vou usar números pra ficar mais simples de entender):
var sorteio = choose(0,1,2,3,4,5,6,7,8,choose(9,10,11,12))
A chance dos números de 0 a 8 sair, é de 1 em 10, pois tem 10 elementos a serem sorteados, porém o número 9 por exemplo, precisa ser escolhido no primeiro sorteio, para então executar um novo sorteio com 4 possibilidades, multiplicando a dificuldade do sorteio do primeiro, que é 10, ou seja, 1 em 40, então os números do segundo choose se torna muito mais difícil de ocorrer, em um jogo por exemplo, isso pode ser intencional (como um inimigo mais raro, que não pode aparecer com a mesma frequência dos demais, ou itens, powerups etc), então, caso queira que haja a mesma chance entre os sorteios, tem que usar um array (como foi dito pelo Thyago, no mesmo tópico).
A segunda resposta é ainda mais absurda, fica subentendido que todas as funções (com argumentos variáveis???? ou não???) precisam ter 16 argumentos ou vai dar erro, não entendi mesmo, de fato todas as funções do Game Maker, só suportam 16 argumentos no máximo, mas as funções podem ter menos argumentos sim, sem que isso dê algum erro, salvo no caso que são argumentos indispensáveis, como o instance_create, que pede 3 informações: x, y e o objeto, dai não tem como não colocar uma delas, inclusive se criar um script, é possível coletar apenas 16 variáveis (através das variáveis argument0 até argument15).
Enfim é isso ai, só queria corrigir isso, me senti incomodado. Flw!