Foros del Web » Programando para Internet » Javascript »

Array orden aleatorio sin repetir

Estas en el tema de Array orden aleatorio sin repetir en el foro de Javascript en Foros del Web. Tengo este array: var n_f_c_t = [ ["x", "y", "b", "r"], ]; Y este código dentro de una función para que me lo haga de ...
  #1 (permalink)  
Antiguo 25/12/2015, 13:23
Avatar de ernest_mataro  
Fecha de Ingreso: octubre-2010
Ubicación: Mataró(Barcelona)
Mensajes: 26
Antigüedad: 13 años, 5 meses
Puntos: 0
Array orden aleatorio sin repetir

Tengo este array:

var n_f_c_t =
[
["x", "y", "b", "r"],
];

Y este código dentro de una función para que me lo haga de forma aleatoria:

var infe_ale = 0;
var supe_ale = n_f_c_t[0].length - 1;
var n_posibilidades = (supe_ale + 1) - infe_ale;
var n_ale = Math.random() * n_posibilidades;
n_ale = Math.floor(n_ale);
n_ale = (infe_ale + n_ale);
n_f_c_t[0].splice(n_ale, 1);

Funciona perfectamente.
La cuestión es, que debería hacer para que las letras una vez el array quede vacío vuelva a quedar como estaba.
Gracias por adelantado.
  #2 (permalink)  
Antiguo 25/12/2015, 17:04
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.551
Antigüedad: 12 años, 4 meses
Puntos: 977
Respuesta: Array orden aleatorio sin repetir

Si al decir que debe "quedar como estaba" te refieres a que nuevamente posea a los elementos iniciales, solo tendrías que obtener una copia de los mismos al inicio y cada vez que elimines a un elemento, debes comprobar que la cantidad de elementos del array sea igual a cero para volver a asignarle los valores.

Un saludo
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #3 (permalink)  
Antiguo 26/12/2015, 11:46
Avatar de ernest_mataro  
Fecha de Ingreso: octubre-2010
Ubicación: Mataró(Barcelona)
Mensajes: 26
Antigüedad: 13 años, 5 meses
Puntos: 0
Respuesta: Array orden aleatorio sin repetir

OK, Merci.
  #4 (permalink)  
Antiguo 29/12/2015, 14:09
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 15 años, 9 meses
Puntos: 1012
Respuesta: Array orden aleatorio sin repetir

Eso garantiza la aleotoriedad pero no la no repetición. Tal vez eso se pueda subsanar, añadiendo el elemento eliminado a un nuevo array con el método unshift(). Este array tendrá los elementos con los que se rellenar el array original.

Como el índice del último elemento será 0, al comenzar la segunda vuelta, habría que asegurarse de que el número aleatorio no sea 0. Para esto se ha de usar http://jsfiddle.net/marlanga/sg2Ja/4/
__________________
if(ViolenciaDeGénero) {alert('MUJER ASESINADA');}
  #5 (permalink)  
Antiguo 01/01/2016, 07:44
 
Fecha de Ingreso: noviembre-2015
Mensajes: 231
Antigüedad: 8 años, 4 meses
Puntos: 86
Respuesta: Array orden aleatorio sin repetir

Hola

He intentado hacer lo que decís. La sugerencia de Alexis88 me ha funcionado, pero la de IsaBelM hace que cuantas mas vueltas se deje correr el código, más se pierde la aleatoriedad. Por ejemplo; tengo un array de 4 elementos ["a", "b", "c", "d"], pues en la tercera vuelta los elementos ya aparecen repetidos. En ocasiones hasta en la segunda vuelta. ¿Qué estoy haciendo mal?

Código HTML:
Ver original
  1. a, b, d, d --> segunda vuelta
  2. a, d, c, a --> tercera vuelta
  3. .......
  #6 (permalink)  
Antiguo 03/01/2016, 15:35
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 15 años, 9 meses
Puntos: 1012
Respuesta: Array orden aleatorio sin repetir

Puede que no estés haciendo nada mal. Según cometas, se me pasó decir que los elementos del nuevo array (array copia) han de.ser eliminados cuando el largo del array original sea 0. Ya que unshift() añade un nuevo elemento al inicio del array
__________________
if(ViolenciaDeGénero) {alert('MUJER ASESINADA');}
  #7 (permalink)  
Antiguo 05/01/2016, 06:43
 
Fecha de Ingreso: noviembre-2015
Mensajes: 231
Antigüedad: 8 años, 4 meses
Puntos: 86
Respuesta: Array orden aleatorio sin repetir

Ahora sí que funciona. He ido cogiendo de un lado y de otro y al final me ha salido esto. A ver si podéis echarle un vistazo y me decís que tal
Código Javascript:
Ver original
  1. <!DOCTYPE html>
  2. <head>
  3. <meta charset="utf-8" />
  4. <title>Documento sin título</title>
  5. <script>
  6. var barajar = new Barajar ({
  7.  
  8.     cartas: ['a', 'b', 'c', 'd'],
  9.     intervalo: 2000,
  10.     indice: -1,
  11.     mesa: '#mesa'
  12. });
  13.  
  14.  
  15. function Barajar(opt) {
  16.  
  17.     if (!(this instanceof Barajar)) return new Barajar();
  18.  
  19.     this.original = opt.cartas || [];
  20.     this.copia = [];
  21.     this.indice = opt.indice || -1;
  22.     this.intervalo = opt.intervalo || 1000;
  23.     this.mesa = opt.mesa || null;
  24.     this.i = 0;
  25. }
  26.  
  27.  
  28. Barajar.prototype.repartir = function() {
  29.  
  30.     this.indice = (this.indice < 0) ? Math.floor(Math.random() * this.original.length) : (this.indice + Math.floor(Math.random() * (this.original.length-1) + 1)) % this.original.length;
  31.  
  32.     var carta = this.original.splice(this.indice, 1);
  33.     this.copia.unshift(carta);
  34.  
  35.     if (!this.original.length) {
  36.  
  37.         this.original = Array.prototype.slice.call(this.copia, 0);
  38.         this.copia.splice(0, Number.MAX_VALUE);
  39.     }
  40.  
  41.     document.querySelector(this.mesa).innerHTML += (this.i++ % 4 == 0) ? '<br />' + carta : ' | ' + carta;
  42.  
  43.     setTimeout(this.repartir.bind(this), this.intervalo);
  44. }
  45.  
  46.  
  47. document.addEventListener('DOMContentLoaded', function() {barajar.repartir();}, false);
  48. </script>
  49. </head>
  50. <body>
  51. <div id="mesa"></div>
  52. </body>
  53. </html>

Etiquetas: funcion, orden, repetir
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:47.