• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Ridelight

Duvida RAND

7 mensagens neste tópico

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º

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora