# Duvida RAND ## Recommended Posts ```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 on other sites Boas!

Aí está uma possível resposta!

```aleatorio = new Array();
for (i=1;i<4;i++) {
rand = random(10)+1;
if (rand <> aleatorio & rand <> aleatorio) {
aleatorio[i]=rand;
} else {
i--;
}
}
trace ("r1="+aleatorio+" - r2="+aleatorio+" - r3="+aleatorio);
```

Abraços,

MagNastiK

##### Share on other 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

Ricardo Castelhano

-----------------------

FullStack Developer

Technical Manager

Trainer

##### Share on other 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 🙂

##### Share on other 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

Ricardo Castelhano

-----------------------

FullStack Developer

Technical Manager

Trainer

##### Share on other 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 🙂

##### Share on other 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 aleatorios:Array = new Array();

// popular a lista de números aleatórios escolhidos

{

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

Register a new account

×

• #### Revista PROGRAMAR

• Wiki
• IRC
×
• Create New...