Jump to content

Recommended Posts

Posted

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

Posted

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

  • 1 month later...
Posted

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 🙂

Posted

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

Posted

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 🙂

Posted

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.

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.