Jump to content
Sign in to follow this  
Ridelight

Duvida RAND

Recommended Posts

Ridelight

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º

Share this post


Link to post
Share on other sites
magnastik

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

Share this post


Link to post
Share on other sites
Grettir

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

Share this post


Link to post
Share on other sites
Idoru

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 :)

Share this post


Link to post
Share on other sites
Grettir

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

Share this post


Link to post
Share on other sites
Idoru

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 :)

Share this post


Link to post
Share on other sites
dimen

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.


Life is just a game, so I live to play!

Share this post


Link to post
Share on other sites

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
Sign in to follow this  

×
×
  • 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.