Comunidad de diseño web y desarrollo en internet online

Como hacer que random no se repita

Citar            
MensajeEscrito el 10 Jun 2005 08:18 pm
Hola otra vez...

El problema es el siguiente tengo 15 cajas de texto en las cuales extraigo de un xml 15 palabras de 50 con random pero en ocasiones depende del random se repiten como puedo evitar esto este es el codigo que llevo...

Código :

var miXML = new XML();
miXML.ignoreWhite = true;
miXML.load("frases.xml");
miXML.onLoad = function() {
   longitud = 50;

   num1 = random(longitud);
   num2 = random(longitud);
   num3 = random(longitud);
   num4 = random(longitud);
   num5 = random(longitud);
   num6 = random(longitud);
   num7 = random(longitud);
   num8 = random(longitud);
   num9 = random(longitud);
   num10 = random(longitud);
   num11 = random(longitud);
   num12 = random(longitud);
   num13 = random(longitud);
   num14 = random(longitud);
   num15 = random(longitud);

   frase1.text = miXML.firstChild.childNodes[num1].attributes.frase;
   frase2.text = miXML.firstChild.childNodes[num2].attributes.frase;
   frase3.text = miXML.firstChild.childNodes[num3].attributes.frase;
   frase4.text = miXML.firstChild.childNodes[num4].attributes.frase;
   frase5.text = miXML.firstChild.childNodes[num5].attributes.frase;
   frase6.text = miXML.firstChild.childNodes[num6].attributes.frase;
   frase7.text = miXML.firstChild.childNodes[num7].attributes.frase;
   frase8.text = miXML.firstChild.childNodes[num8].attributes.frase;
   frase9.text = miXML.firstChild.childNodes[num9].attributes.frase;
   frase10.text = miXML.firstChild.childNodes[num10].attributes.frase;
   frase11.text = miXML.firstChild.childNodes[num11].attributes.frase;
   frase12.text = miXML.firstChild.childNodes[num12].attributes.frase;
   frase13.text = miXML.firstChild.childNodes[num13].attributes.frase;
   frase14.text = miXML.firstChild.childNodes[num14].attributes.frase;
   frase15.text = miXML.firstChild.childNodes[num15].attributes.frase;
   
};




Espero que alguien pueda ayudarme muchas gracias.

Por snail

13 de clabLevel



 

firefox
Citar            
MensajeEscrito el 10 Jun 2005 09:39 pm
Uff, si te falta a little bit de logica en cuanto a programacion todo lo que tu hiciste, se haria en unas pocas lineas:

Código :

var miXML = new XML ();
miXML.ignoreWhite = true;
miXML. load("frases.xml");

miXML.onLoad = function (){
       longitud = miXML.firscChild.childNodes.length;
       for (i=0; i<=15;i++){
           i= random (longitud);
          _root["frase"+i].text = miXML.firstChild.childNodes[i].attributes.frase;
      }
}


Bueno despues de reducirte todo lo que escribiste en unas pocas lineas :lol:

Ademas creo que esta es la segunda vez que te ayudo, porque postee un codigo parecido a este antes... Si fue a ti recuerda que te dije que deberias almacenar los datos que vas generando aleatoriamente en un vector e irlo revisando cada vez que generes un nuevo numero, sino bueno es asi. :D

Si nadie te contesta en un rato, te lo hago mas tarde, tengo clase :wink:

Por Maikel

BOFH

5575 de clabLevel

22 tutoriales
5 articulos

Genero:Masculino   Team Cristalab

Claber de baja indefinida

msie
Citar            
MensajeEscrito el 10 Jun 2005 09:42 pm
Bueno en el codigo anterior hay unos espacios que no deberian ir... :wink:

Por Maikel

BOFH

5575 de clabLevel

22 tutoriales
5 articulos

Genero:Masculino   Team Cristalab

Claber de baja indefinida

msie
Citar            
MensajeEscrito el 10 Jun 2005 10:39 pm
Si soy yo a quien me ayudaste hace unos dias... y de verdad te lo agradezco, porque lo de leer los datos desde el xml funciono perfectamente..

Pero en verdad no se como almacenar esos datos en un vector para despues revisarlos, por fa si me puedes explicar. Me imaginaba que todo mi codigo debia ser más pequeño, pero poco a poco...aprendere.

Por snail

13 de clabLevel



 

firefox
Citar            
MensajeEscrito el 11 Jun 2005 12:56 am
Claro que poco a poco irás aprendiendo :wink: y esa mentalidad me gusta :)

mira, para empezar en este codigo que te paso el amigo Maikel hay unos errosillos que vi asi de pasadita.. que corrijo para no confundirte mas, ok...

Código :

var miXML = new XML ();
miXML.ignoreWhite = true;
miXML.load("frases.xml");

miXML.onLoad = function (){
       longitud = miXML.firscChild.childNodes.length;
       for (i=0; i<=15;i++){
           R= random(longitud);
          _root["frase"+i].text = miXML.firstChild.childNodes[R].attributes.frase;
      }
}  


y sobre los vectores, pues tambien llamados arreglos o arrays..

Presiona F1 en tu flash y busca la Clase Array ... alli viene mucha información, como esta:
Ejemplo
Sintaxis 1: en el ejemplo siguiente se crea un nuevo objeto Array con una longitud inicial de 0.

my_array = new Array();
trace(my_array.length); // devuelve 0

y COMO METER ELEMENTOS...

myPets = ["gato", "perro"];
pushed = myPets.push("pájaro", "pez");
trace(pushed);

o ASI:
Ejemplo
En el código siguiente se explica cómo se actualiza la propiedad length.

my_array = new Array();
trace(my_array.length); // la longitud inicial es 0
my_array[0] = 'a';
trace(my_array.length); // my_array.length se actualiza a 1
my_array[1] = 'b';
trace(my_array.length); // my_array.length se actualiza a 2
my_array[9] = 'c';
trace(my_array.length); // my_array.length se actualiza a 10


Todo esto en la ayuda de flash.. cualquier duda, me avisas..

saludox!!!

Por Sr. QUHO

SWAT Team

1643 de clabLevel

5 tutoriales
1 articulo

  SWAT

firefox
Citar            
MensajeEscrito el 11 Jun 2005 01:34 am
Ah si no me habia dado cuenta que habia usado la misma variable para el random y para el for :lol: , bueno gracias QUHO, lo que pasa es que no lo probe y codifique eso directamente en el editor de respuestas :wink:

Por Maikel

BOFH

5575 de clabLevel

22 tutoriales
5 articulos

Genero:Masculino   Team Cristalab

Claber de baja indefinida

msie
Citar            
MensajeEscrito el 11 Jun 2005 04:59 am
si, eso suele pasar, la cuestion es dar la logica, pero como nuestro amigo esta un poco perdido, por eso me permití hacer la aclaracion :D

Por Sr. QUHO

SWAT Team

1643 de clabLevel

5 tutoriales
1 articulo

  SWAT

firefox
Citar            
MensajeEscrito el 11 Jun 2005 06:42 am
Ok lo prometido es deuda, aqui esta el codigo:



Código :

var vector = new Array();
var miXML = new XML();
miXML.ignoreWhite = true;
miXML.load("frase.xml");

maximo = 15; //Cuantos elementos?, lo puse 15 porque tu insistes con 15, pero puedes cambiarlo

miXML.onLoad = function (){
   long = miXML.firstChild.childNodes.length;
   for (i=0;i<maximo;i++){
      R= random(long);
        while (buscar(R)){  //busco hasta que encuentre uno que no este
         R= random(long);
      }
      insertar(R); //inserto
   }
   for (i=0;i<maximo;i++){ 
      //aqui va el codigo de la caja de texto
      trace(miXML.firstChild.childNodes[vector[i]].attributes.frase);
   }                          
}

function buscar (n:Number):Boolean{
   for (i=0;i<vector.length;i++){
      if (vector[i]==n){
         return true; //fue encontrado
      }
   }
   return false; //no fue encontrado
}
function insertar (n:Number){
   vector[vector.length]=n; //inserto el nuevo numero generado en el vector
}


Ok no te preocupes, ya diste el primer paso para aprender que es el interes... Bueno creo que el codigo se explica por si solo, te aseguro que funciona porque lo probe, este si lo hice en flash y cree un XML para hacer la prueba con 50 elementos :lol: .

Bueno si tienes alguna duda con gusto te contestare :D .

Recomendaciones finales:
* trata de que los elementos a buscar no excedan la mitad del total de elementos de rango de busqueda, es decir si el rango de busqueda es de 50 no deberias pasarte de 25, que el codigo lo hace si, pero quizas pueda tardar en buscar elementos distintos.
* y por supuesto que el numero de elementos a buscar no sean mayor que la cantidad de elementos.

este ultimo se puede arreglar facil con una simple condicion, que abarque los for, asi:

Código :

  if (maximo<long){
    // aqui iria todo codigo de miXML.onLoad function exceptuando la linea de long=miXML.firstChild.childNodes.length;
 }


bueno eso es todo, como te dije, alguna duda posteala con gusto te la contestare :D

Ah y QUHO gracias por la correcion, en serio no me molesto para nada. :)

Por Maikel

BOFH

5575 de clabLevel

22 tutoriales
5 articulos

Genero:Masculino   Team Cristalab

Claber de baja indefinida

msie
Citar            
MensajeEscrito el 11 Jun 2005 09:20 am
Extracto del tutorial carga_aleatoria_controlada_de_..
/* Esta función sólo nos devolverá un valor comprendido en la variable NumMovies, este se comprobara para ver si ya existe en un Array creado en tiempo de ejecución. */
var MiArray = new Array();
var NumMovies = 4;
function Busqueda() {
var Controlde = true;
// while.. si ya se ha emitido el numero, repite la búsqueda del numero al azar
while (Controlde == true) {
Controlde = false;
Minor = random(NumMovies);
//for.. recorre todos las variables del Array, para buscar si ya ha sido emitido el numero actual
for (x=0; x<(NumMovies); x++) {
if (MiArray[x] == Minor) {
Controlde = true;
break;
}
}
}
/* Una vez pasado el número aleatorio y comprobado que no existe en ningún elemento del Array crea un nuevo elemento del Array e introduce el nuevo valor. A continuación subimos el valor de la variable, para el siguiente elemento */
MiArray[ValorIni] = Minor;
ValorIni++;
return Minor;
/*return.. se utiliza para que al solicitar una función nos devuelva el valor de la variable que se
indica. */

}

aqui te respondo a tu pregunta .. por lo menos al titulo.
de esta manera consigues un numero aleatorio no repetido

donde pone NumMovies es lo que seria longitud.. y luego una vez tengas esta funcion.... sustituyes random(longitud) por busqueda().

espero lo tengas claro y te soluciones sin grandes complicaciones.

Por Silvestre_

391 de clabLevel

1 tutorial

 

"un simple aficionado", pero acepto propuestas de trabajo

firefox
Citar            
MensajeEscrito el 13 Jun 2005 05:21 pm
Pues en verdad no me queda mas que agradecerles a todos, se que me falta bastante sobre programacion pero hay la llevo empeze por necesidad a usar flash hace 2 meses y cuando necesite programar esto de los randoms fue un dolor de cabeza.

Pero me encontre con esta pagina y me han ayudado mucho, no solo con las respuestas sino con los tutos y demas post que puedo ver para poco a poco aprender.. Muchas gracias a todos...

Pronto les dare lata otra vez...pero con otra cosa diferente.

Por snail

13 de clabLevel



 

firefox
Citar            
MensajeEscrito el 17 Jul 2014 06:48 pm
Hola como estan? yo tengo el mismo problema que necesito que no se repitan los tracks de los nodos del xml estando en random, intente aplicar lo que han escrito.. pero no logro hacerlo, el codigo original viene por este lado, el que me pueda comentar o ayudar.. mil gracias!

var song_folder:String = "";
var xml_folder:String = "songs/";
var song_list:Array = new Array();
var track_list:Array = new Array();
var artist_list:Array = new Array();
var album_list:Array = new Array();
var current:Number = 0;
var position:Number;
var new_volume:Number = 100;
var k:Number = 0;
var flashmo_xml:XML = new XML();
flashmo_xml.ignoreWhite = true;
flashmo_xml.onLoad = function()
{
var nodes:Array = this.firstChild.childNodes;
//var index:int=Math.floor(nodes.length()*Math.random());
for(var k = 0; k < nodes.length; k++)
{
song_list.push(nodes[k].attributes.filename);
track_list.push(nodes[k].attributes.track);
artist_list.push(nodes[k].attributes.artist);
album_list.push(nodes[k].attributes.album);
}
randomTrack("start");
}

flashmo_xml.load( xml_folder + "1.xml");



function randomTrack(track:String):Void

{
if(track == "prev")
k--;
else if(track == "start")
k = 0;
else
k++;

if(k == song_list.length)
k = 0;
else if(k < 0)
k = song_list.length - 1;

k = Math.round(Math.random()*song_list.length)
s = new Sound(); s.loadSound(song_list[k], true);
s.setVolume(new_volume);
track_title.text = track_list[k];
artist_name.text = artist_list[k];
album_title.text = album_list[k];
track_info.text = "TRACK " + (k+1) + " DE " + song_list.length;
fm_play.gotoAndStop(1);
}

Por Lacruz

0 de clabLevel



 

chrome

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.