variable repetir numeros numero matriz imprimir generar entero desordenar codigo array aleatorios aleatorio aleatoria javascript json object shuffle random

matriz - numeros aleatorios en javascript sin repetir



JavaScript-Mezclar objetos dentro de un objeto(aleatorizar) (3)

Esta pregunta ya tiene una respuesta aquí:

Necesito implementar un resultado aleatorio de JSON.

El formato del JSON es de dos objetos:

resultado:

Pregunta (objeto)

[Object { id="4c6e9a41470b19_96235904", more...}, Object { id="4c784e6e928868_58699409", more...}, Object { id="4c6ecd074662c5_02703822", more...}, 6 more...]

Tema (objeto)

[Object { id="3jhf3533279827_23424234", more...}, Object { id="4634663466cvv5_43235236", more...}, Object { id="47hf3892735298_08476548", more...}, 2 more...]

Quiero aleatorizar el orden de los objetos dentro del objeto de pregunta y los objetos de tema.


El método más sencillo (no es el orden aleatorio perfecto, pero en algunos casos puede ser mejor):

function randomize(a, b) { return Math.random() - 0.5; } yourQuestionArray.sort(randomize); yourTopicArray.sort(randomize);

o

yourQuestionArray.sort(function (a, b) {return Math.random() - 0.5;}); yourTopicArray.sort(function (a, b) {return Math.random() - 0.5;});

( http://jsfiddle.net/dJVHs/ )


Encontré esta publicación sobre el uso del algoritmo de Fisher-Yates para mezclar una matriz en JavaScript. Utiliza esta función:

function fisherYates ( myArray ) { var i = myArray.length; if ( i == 0 ) return false; while ( --i ) { var j = Math.floor( Math.random() * ( i + 1 ) ); var tempi = myArray[i]; var tempj = myArray[j]; myArray[i] = tempj; myArray[j] = tempi; } }


Podría usar un shuffle de Fisher-Yates-Durstenfeld :

var shuffledQuestionArray = shuffle(yourQuestionArray); var shuffledTopicArray = shuffle(yourTopicArray); // ... function shuffle(sourceArray) { for (var i = 0; i < sourceArray.length - 1; i++) { var j = i + Math.floor(Math.random() * (sourceArray.length - i)); var temp = sourceArray[j]; sourceArray[j] = sourceArray[i]; sourceArray[i] = temp; } return sourceArray; }