Ridelight Posted February 2, 2006 at 08:26 AM Report #13160 Posted February 2, 2006 at 08:26 AM rand1 := Random(1; 10; 1) rand2 := Random(1; 10; 1) rand3 := Random(1; 10; 1) Como faço para o 2º numero ser diferente do 1º e o 3º ser diferente do 1º e 2º Regras do FÓRUM
magnastik Posted February 2, 2006 at 04:14 PM Report #13179 Posted February 2, 2006 at 04:14 PM Boas! Aí está uma possível resposta! aleatorio = new Array(); for (i=1;i<4;i++) { rand = random(10)+1; if (rand <> aleatorio[1] & rand <> aleatorio[2]) { aleatorio[i]=rand; } else { i--; } } trace ("r1="+aleatorio[1]+" - r2="+aleatorio[2]+" - r3="+aleatorio[3]); Abraços, MagNastiK
Grettir Posted February 3, 2006 at 01:34 AM Report #13210 Posted February 3, 2006 at 01:34 AM Heyas, so um pequeno reparo, na versao 2.0 do ActionScript, este cresceu e entrou na idade OOP. Apartir daqui deixou de ser aconselhavel a utilizaçao de random(10) para dar um aleatorio de 10 numeros. Entao que codigo usar ? Math.random() para dar TODOS os numeros entre 0 e 1 (com virgulas e tal). Caso se queira 0 a 10, Math.random()*10...e so numeros inteiros Math.round(Math.random()*10) Para a questao levantada, a minha "soluçao" é: //---------------------------------------------- var rand1:Number; var rand2:Number; var rand3:Number; onEnterFrame = function () { rand1 = Math.round(Math.random()*10); rand2 = Math.round(Math.random()*10); rand3 = Math.round(Math.random()*10); if (rand1 != rand2 && rand2 != rand3) { trace("Rand1: "+rand1+" - Rand2: "+rand2+" - Rand3: "+rand3); delete this.onEnterFrame; } }; //-------------------------------------------------- Ora, assim colocamos o Flash a calcular 3 numeros aleatorios até ao momento em que saem 3 que sao diferentes entre eles. Nessa altura faz um trace (aparece a informaçao na janela Output) e damos por terminado o processamento com o delete etc e tal... Fiquem bem Ricardo Castelhano ----------------------- FullStack Developer Technical Manager Trainer
Idoru Posted March 6, 2006 at 11:48 AM Report #17005 Posted March 6, 2006 at 11:48 AM Heyas, so um pequeno reparo, na versao 2.0 do ActionScript, este cresceu e entrou na idade OOP. Apartir daqui deixou de ser aconselhavel a utilizaçao de random(10) para dar um aleatorio de 10 numeros. Entao que codigo usar ? Math.random() para dar TODOS os numeros entre 0 e 1 (com virgulas e tal). Caso se queira 0 a 10, Math.random()*10...e so numeros inteiros Math.round(Math.random()*10) Para a questao levantada, a minha "soluçao" é: //---------------------------------------------- var rand1:Number; var rand2:Number; var rand3:Number; onEnterFrame = function () { rand1 = Math.round(Math.random()*10); rand2 = Math.round(Math.random()*10); rand3 = Math.round(Math.random()*10); if (rand1 != rand2 && rand2 != rand3) { trace("Rand1: "+rand1+" - Rand2: "+rand2+" - Rand3: "+rand3); delete this.onEnterFrame; } }; //-------------------------------------------------- Ora, assim colocamos o Flash a calcular 3 numeros aleatorios até ao momento em que saem 3 que sao diferentes entre eles. Nessa altura faz um trace (aparece a informaçao na janela Output) e damos por terminado o processamento com o delete etc e tal... Fiquem bem Oi onEnterFrame para um random? n te lembraste de nada mais pesadito 🙂 Usa um while 🙂
Grettir Posted March 7, 2006 at 01:01 AM Report #17166 Posted March 7, 2006 at 01:01 AM heyas, nesse caso o while vai processar a mesma velocidade, causando o mesmo "peso". Enquanto o while termina qd chega ao final do teste logico, quando usas enterFrame faras o efeito semelhante terminando-o (delete this.onEnterFrame) Fica bem Ricardo Castelhano ----------------------- FullStack Developer Technical Manager Trainer
Idoru Posted March 7, 2006 at 11:33 AM Report #17183 Posted March 7, 2006 at 11:33 AM Erm, heyas, nesse caso o while vai processar a mesma velocidade, causando o mesmo "peso". Enquanto o while termina qd chega ao final do teste logico, quando usas enterFrame faras o efeito semelhante terminando-o (delete this.onEnterFrame) Fica bem Não deves estar ciente do que acabaste de dizer certo? Pensa lá, onde é corrido o onEnterFrame, e a quantidade de coisas que tens de chamar para o correr, faz um teste com o gettimer 🙂
dimen Posted March 7, 2006 at 01:10 PM Report #17195 Posted March 7, 2006 at 01:10 PM Eu mais do que o "onEnterFrame", do qual também discordo, sou contra a forma como está a ser feita a obtenção dos valores, porque para simplificar a comparação, está-se sempre a ir buscar os 3 valores de raiz, o que num caso extremo, poderia levar a percorrer este ciclo demasiadas vezes. Para mim isto era resolvido com algo tão simples quanto: var rand1:Number = Math.ceil(Math.random()*10); var rand2:Number = Math.ceil(Math.random()*10); while(rand2 == rand1) { rand2 = Math.ceil(Math.random()*10); } var rand3:Number = Math.ceil(Math.random()*10); while(rand3 == rand1 || rand3 == rand2) { rand3 = Math.ceil(Math.random()*10); } Fica também a nota da utilização do ceil. Ao usar Math.round a lista de valores seria entre 0 e 10, ao usar Math.ceil é entre 1 e 10 e ao usar Math.floor é entre 0 e 9. No entanto, se alguém pretender algo muito mais genérico, sugeria a seguinte hipótese: // definir o intervalo entre 30 e 100 (inclusivo, neste caso) var minimo:Number = 30; var maximo:Number = 100; var hipoteses:Array = new Array(); // popular o array com as hipóteses possíveis for(var j:Number=minimo, k:Number=0; j<=maximo; j++, k++) { hipoteses[k] = j; } // definir a quantidade de números que se pretende extrair var qtidade_aleatorios:Number = 20; var aleatorios:Array = new Array(); // popular a lista de números aleatórios escolhidos for(var j:Number=0; j<qtidade_aleatorios; j++) { var indice:Number = Math.floor(Math.random()*hipoteses.length); aleatorios[j] = hipoteses[indice]; hipoteses = hipoteses.slice(0,indice).concat(hipoteses.slice(indice+1)); } Basicamente esta abordagem puxa no inicio um pouco mais (aquando da criação da lista possível de valores), mas depois compensa porque evita repetições "potencialmente demoradas" nos whiles, pois garante que cada valor só aparece uma única vez. Também é interessante quando se pretende ir buscando valores sempre diferentes ao longo da execução do programa. Tipicamente tenho código deste tipo (manipulação de array, mistura de posições, etc) dentro de um ficheiro .as, para fácil reutilização nos vários projectos.
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now