Básicamente me escoger un número al azar entre 0 a 24:

Math.floor(Math.random() * myArray.length); //myArray contains 25 items

Digamos que viene a ser 8. Ahora quiero obtener otro número en el mismo rango de 0 a 24 pero esta vez, no quiero un 8. La próxima vez, yo podría hacer una 15. Ahora quiero rodar de nuevo, pero yo no quiero un 8 o 15. La manera en que yo estoy manejando ahora, esto es mediante el uso de hacer bucles while y si el número sale lo mismo, acabo de lanzar.

Esta es una pequeña parte de mi tarea y yo, de hecho, han trabajando para cumplir con todos los requerimientos, por lo que supongo que se podría decir que esto es para mi propio beneficio personal para que yo pueda escribir esto correctamente y no terminan en “the daily wtf”.

OriginalEl autor Pete | 2011-04-02

6 Comentarios

  1. 18

    Establecer un array con todos los valores (esta es sólo una opción válida si sólo lo estás haciendo números pequeños, como el 25 en el ejemplo), como este:

    var array = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24];

    a continuación, elegir un número aleatorio entre 0 y la longitud de matriz:

    var num = Math.floor(Math.random() * array.length);

    quitar que el número de índice de la matriz:

    var roll = array.splice(num, 1);

    Javascript splice() quita indizar los elementos de una matriz y devuelve el elemento(s) como una matriz. Perfecto para su uso.

    Agarrar el primer índice de la bobina, ya que la corte sólo 1 de todos modos:

    var yourNumber = roll[ 0 ];

    Seguir haciendo por tantos rollos como usted desea. También, usted puede ser que desee almacenar la matriz original como copia de modo que usted puede “resetear” los números fácilmente.

    Gracias. Usted tiene un error creo, porque ustedes son el uso de suelo no es necesario restar 1 a la longitud. Si estoy equivocado, quiero saber porque tengo algo de código para solucionar =P
    usted podría estar en lo correcto. Estoy un poco de niebla en los rendimientos de la Math.random(). Me resta 1 a la posibilidad de que Math.random() siempre devuelve “1”. Si nunca hace, entonces, sí: restando una introducirá un error.
    Sí, la definición es que devuelve un número ENTRE 0-1 así que supongo que es implícito, que no puede ser 0 O 1 exactamente.
    parece que eres de la derecha. El valor máximo para las Matemáticas.aleatorio() es algo menor que 1. He buscado de alta y baja, y la mejor respuesta para LO que número es, es “menos de 1.” ¿Por qué es un secreto tan grande? De todos modos, me he enrollado la respuesta a mi respuesta inicial.
    Casi, pero ser cero. Específicamente Math.random() devuelve un número en el intervalo [0, 1). No hay una exacta límite superior (probablemente debido a que el algoritmo exacto usado depende de la aplicación), pero que, básicamente, se puede asumir que es el siguiente número de punto flotante por debajo de 1.

    OriginalEl autor rockerest

  2. 3

    Esto es fácil chicos. Usted no quiere que la recursividad para este. Estas respuestas son muy malas. Lo ideal sería que usted no desea codificar la matriz.

    function getRandomWithOneExclusion(lengthOfArray,indexToExclude){
    
      var rand = null;  //an integer
    
        while(rand === null || rand === indexToExclude){
           rand = Math.round(Math.random() * (lengthOfArray - 1));
        }
    
      return rand;
    }

    ahora utilizar el valor devuelto por la función anterior para elegir un elemento a partir de cualquier matriz que desea, simplemente así:

    var arr = [];
    var random = getRandomWithOneExclusion(arr.length,5);  //array has length x, we want to exclude the 5th element
    var elem = arr[random];

    que es. si desea excluir más de un valor, entonces usted tendría que hacer esto más sofisticado, pero para la exclusión de un valor, esto funciona bien. Un recursiva solución para esto es una exageración y una mala idea.

    Yo no he probado esto, pero para excluir más de un elemento, intente esto:

    function getRandomWithManyExclusions(originalArray,arrayOfIndexesToExclude){
    
       var rand = null;
    
       while(rand === null || arrayOfIndexesToExclude.includes(rand)){
             rand = Math.round(Math.random() * (originalArray.length - 1));
        }
         return rand;
      }

    El método anterior no suena muy diferente de la OP del método original. Este método funciona correctamente debido a que no se muestra de manera sesgada de la matriz.

    un bucle while es definitivamente el camino a seguir aquí
    ¿Te gusta el while loop, bucle y hacer un upvote
    No convencido de que si este es un enfoque óptimo. ¿Qué pasa si usted consigue el mismo número al azar que se encuentra en la exlusion lista por un largo tiempo?

    OriginalEl autor Alexander Mills

  3. 2

    Hmz 😕 La forma más rápida de obtener al azar los elementos de una matriz, y asegúrese de que todos los único sería:

    var array = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24];
    
    Array.prototype.shuffle = function shuffle(){
        var tempSlot;
        var randomNumber;
        for(var i =0; i != this.length; i++){
            randomNumber = Math.floor(Math.random() * this.length);
            tempSlot = this[i]; 
            this[i] = this[randomNumber]; 
            this[randomNumber] = tempSlot;
        }
    }
    
    while(array.length!=0){
        array.shuffle();
        alert(array.pop());    
    }
    prototipo de función, shuffle toda la matriz en cada bucle…no tengo pruebas, pero yo soy muy escéptico de que esta es la “forma más rápida.”
    Bueno, si quieres ser técnico al respecto, una re-shuffle no es necesario. “Más rápido” se entiende en lo que respecta a la aplicación, no la velocidad de procesamiento 😕
    Esta es la solución que se propone para el mismo problema en Jon Bentley Programación de Perlas.
    +1 la causa al azar al azar pulsaciones aleatorias 11 de cada 10 veces.
    El más aleatorio es el mejor… ¿verdad ?

    OriginalEl autor Khez

  4. 0

    Estoy seguro de que hay un par de maneras de hacer esto, pero usted puede poner todos los números en algo parecido a una pila, mezcla todo y, a continuación, el pop fuera de ella para obtener sus números aleatorios. O, al azar de buscar en cada momento y se quita de la pila.

    OriginalEl autor theproxy

  5. 0

    paso 1> crear una matriz CHECK_ARRAY llenar la matriz con el valor que está fuera del alcance de su número aleatorio [llenar con 26 si desea generar un número dentro de 0-25]

    paso 2-> generar un número aleatorio y agregar a RANDOM_ARRAY y también agregar a la CHECK_ARRAY
    que es

    i=0;
    CHECK_ARRAY[i]=random;
    i++;

    paso 3-> generar un nuevo número aleatorio y de ir a pesar de la CHECK_ARRAY, si usted encuentra a 26, a continuación, ignorar, por el contrario, si se encuentran duplicados, a continuación, volver a generar un número aleatorio y continuar con el paso 3 de nuevo hasta que encontró un único número aleatorio !

    OriginalEl autor Sourav

  6. 0

    Aquí es una prueba y una solución simple:

    var array= [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24];
    var random_value; 
    var index;
    var shuffled_array = new Array(24);
    
    for (var i = 0; i < 24; i++) { 
    random_value = array[Math.floor(Math.random()*array.length)]; //Returns a value between 1 and 24
    index = array.indexOf(random_card); //Gets the index of the choosen random value
    array.splice(index, 1); //Go to index of that array and remove it
    shuffled_array [i] = random_value; //Put that value in a new array
    
    window.alert("array: "+array+"\n"+"random_value: "+random_value+"\n"+"shuffled_array: "+shuffled_array);
    }

    En otras soluciones, creo que se olvidó de búsqueda para el índice.

    OriginalEl autor reiver

Dejar respuesta

Please enter your comment!
Please enter your name here