Получение случайного значения из массива JavaScript

Рассматривать:

var myArray = ['January', 'February', 'March'];    

Как я могу выбрать случайное значение из этого массива, используя JavaScript?

33 ответа

Решение
var rand = myArray[Math.floor(Math.random() * myArray.length)];

Если у вас уже есть подчеркивание или перевод текста, вы можете использовать _.sample,

// will return one item randomly from the array
_.sample(['January', 'February', 'March']);

Если вам нужно получить более одного элемента случайным образом, вы можете передать это в качестве второго аргумента в подчеркивании:

// will return two items randomly from the array using underscore
_.sample(['January', 'February', 'March'], 2);

или используйте _.sampleSize метод в лодаш:

// will return two items randomly from the array using lodash
_.sampleSize(['January', 'February', 'March'], 2);

Я обнаружил, что еще проще добавить функцию-прототип в класс Array:

Array.prototype.randomElement = function () {
    return this[Math.floor(Math.random() * this.length)]
}

Теперь я могу получить случайный элемент массива, просто набрав:

var myRandomElement = myArray.randomElement()

Обратите внимание, что это добавит свойство ко всем массивам, поэтому, если вы перебираете одно из них, используя for..in ты должен использовать .hasOwnProperty():

for (var prop in myArray) {
    if (myArray.hasOwnProperty(prop)) {
        ...
    }
}

(Это может или не может быть хлопот для вас.)

Метод прототипа

Если вы планируете много получать случайное значение, вы можете определить функцию для него.

Во-первых, поместите это в свой код где-нибудь:

Array.prototype.sample = function(){
  return this[Math.floor(Math.random()*this.length)];
}

Сейчас:

[1,2,3,4].sample() //=> a random element

Код передан в общественное достояние в соответствии с условиями лицензии CC0 1.0.

~~ намного быстрее чем Math.Floor()поэтому, когда речь заходит об оптимизации производительности при создании вывода с использованием элементов пользовательского интерфейса, ~~ выигрывает игру БОЛЬШЕ ИНФОРМАЦИИ

var rand = myArray[~~(Math.random() * myArray.length)];

Но если вы знаете, что в массиве будут миллионы элементов, вы можете пересмотреть битовый оператор и Math.Floor()Битовый оператор ведет себя странно с большими числами. См. Пример ниже, объясненный с выходом. БОЛЬШЕ ИНФОРМАЦИИ

var number = Math.floor(14444323231.2); // => 14444323231
var number = 14444323231.2 | 0; // => 1559421343

Самая короткая версия:

var myArray = ['January', 'February', 'March']; 
var rand = myArray[(Math.random() * myArray.length) | 0]

Скажем, вы хотите выбрать случайный предмет, который отличается от последнего времени (не совсем случайный, но все же распространенное требование)...

Основываясь на ответе @Markus, мы можем добавить еще одну функцию-прототип:

Array.prototype.randomDiffElement = function(last) {
   if (this.length == 0) {
      return;
   } else if (this.length == 1) {
      return this[0];
   } else {
      var num = 0;
      do {
         num = Math.floor(Math.random() * this.length);
      } while (this[num] == last);
      return this[num];
   }
}

И реализовать так:

var myRandomDiffElement = myArray.randomDiffElement(lastRandomElement)

Многие из предлагаемых решений добавляют метод к определенному массиву, который ограничивает его использование только этим массивом. Это решение представляет собой повторно используемый код, который работает для любого массива и может быть безопасным для типов.

Машинопись

      export function randChoice<T>(arr: Array<T>): T {
  return arr[Math.floor(Math.random() * arr.length)]
}

JavaScript

      export function randChoice(arr) {
  return arr[Math.floor(Math.random() * arr.length)]
}

Если у вас есть фиксированные значения (например, список названий месяцев) и вы хотите однострочное решение

var result = ['January', 'February', 'March'][Math.floor(Math.random() * 3)]

Вторая часть массива - это операция доступа, как описано в разделе Почему [5,6,8,7][1,2] = 8 в JavaScript?

Если вы хотите записать его в одну строку, как решение Паскуаля, другим решением будет написать его, используя функцию поиска ES6 (исходя из того факта, что вероятность случайного выбора одного из n предметы 1/n):

var item = ['A', 'B', 'C', 'D'].find((_, i, ar) => Math.random() < 1 / (ar.length - i));
console.log(item);

Используйте этот подход для целей тестирования, и если есть веская причина не сохранять массив только в отдельной переменной. В противном случае другие ответы (floor(random()*length и с помощью отдельной функции) ваш путь.

Используя Faker.js:

const Faker = require('faker');
Faker.random.arrayElement(['January', 'February', 'March']);

Редактирование прототипа Array может быть вредным. Здесь это простая функция, чтобы сделать работу.

function getArrayRandomElement (arr) {
  if (arr && arr.length) {
    return arr[Math.floor(Math.random() * arr.length)];
  }
  // The undefined will be returned if the empty array was passed
}

Использование:

// Example 1
var item = getArrayRandomElement(['January', 'February', 'March']);

// Example 2
var myArray = ['January', 'February', 'March'];
var item = getArrayRandomElement(myArray);

Если вам нужно получить случайный элемент более одного раза, тогда, очевидно, вы должны использовать функцию. Один из способов - сделать эту функцию методом, но обычно это заставит вас кричать за подделку встроенных прототипов.

Однако вы можете добавить метод в сам конкретный массив:

      var months = ['January', 'February', 'March'];
months.random = function() {
    return this[Math.floor(Math.random()*this.length)];
};

Таким образом вы можете использовать months.random() так часто, как вы хотите, не вмешиваясь в общие Array.prototype.

Как и в случае любой случайной функции, вы рискуете последовательно получить одно и то же значение. Если вы этого не хотите, вам нужно будет отслеживать предыдущее значение с помощью другого свойства:

      months.random=function() {
    var random;
    while((random=this[Math.floor(Math.random()*this.length)]) == this.previous);
    this.previous=random;
    return random;
};

Чтобы получить криптостойкий массив случайных элементов, используйте

let rndItem = a=> a[rnd()*a.length|0];
let rnd = ()=> crypto.getRandomValues(new Uint32Array(1))[0]/2**32;

var myArray = ['January', 'February', 'March'];

console.log( rndItem(myArray) )

Рекурсивная, автономная функция, которая может возвращать любое количество элементов (идентично https://lodash.com/docs/4.17.4#sampleSize):

function getRandomElementsFromArray(array, numberOfRandomElementsToExtract = 1) {
    const elements = [];

    function getRandomElement(arr) {
        if (elements.length < numberOfRandomElementsToExtract) {
            const index = Math.floor(Math.random() * arr.length)
            const element = arr.splice(index, 1)[0];

            elements.push(element)

            return getRandomElement(arr)
        } else {
            return elements
        }
    }

    return getRandomElement([...array])
}

Это похоже, но более общее, чем решение @Jacob Relkin:

Это ES2015:

const randomChoice = arr => {
    const randIndex = Math.floor(Math.random() * arr.length);
    return arr[randIndex];
};

Код работает, выбирая случайное число в диапазоне от 0 до длины массива, а затем возвращает элемент с этим индексом.

var item = myArray[Math.floor(Math.random()*myArray.length)];

или эквивалентная более короткая версия:

var item = myArray[(Math.random()*myArray.length)|0];

Образец кода:

var myArray = ['January', 'February', 'March'];    
var item = myArray[(Math.random()*myArray.length)|0];
console.log('item:', item);

Простая функция:

var myArray = ['January', 'February', 'March'];
function random(array) {
     return array[Math.floor(Math.random() * array.length)]
}
random(myArray);

ИЛИ ЖЕ

var myArray = ['January', 'February', 'March'];
function random() {
     return myArray[Math.floor(Math.random() * myArray.length)]
}
random();

ИЛИ ЖЕ

var myArray = ['January', 'February', 'March'];
function random() {
     return myArray[Math.floor(Math.random() * myArray.length)]
}
random();

static generateMonth() { 
const theDate = ['January', 'February', 'March']; 
const randomNumber = Math.floor(Math.random()*3);
return theDate[randomNumber];
};

Вы устанавливаете постоянную переменную для массива, затем у вас есть другая константа, которая выбирает случайным образом между тремя объектами в массиве, а затем функция просто возвращает результаты.

Я нашел способ обойти сложности верхнего ответа, просто соединив переменную rand с другой переменной, которая позволяет отображать это число внутри вызова myArray[];. Удалив созданный новый массив и поиграв с его сложностями, я нашел рабочее решение:

<!DOCTYPE html>
<html>
<body>

<p id="demo"></p>

<script>

var myArray = ['January', 'February', 'March', 'April', 'May'];    

var rand = Math.floor(Math.random() * myArray.length);

var concat = myArray[rand];

function random() {
   document.getElementById("demo").innerHTML = (concat);
}
</script>

<button onClick="random();">
Working Random Array generator
</button>

</body>
</html>

В поисках настоящего однострочного письма я пришел к следующему:

['January', 'February', 'March'].reduce((a, c, i, o) => { return o[Math.floor(Math.random() * Math.floor(o.length))]; })

Другой простой метод:

var myArray = ['keke','keko','cano','halo','zirto'];

var randomValue = myArray[Math.round((Math.random()*1000))%myArray.length];

Способ 1:

  • Используйте функцию Math.random (), чтобы получить случайное число между (0–1, 1 исключая).
  • Умножьте его на длину массива, чтобы получить числа между (0-arrayLength).
  • Используйте Math.floor (), чтобы получить индекс в диапазоне от (0 до arrayLength-1).

const arr = ["фу","бар"];
const randomlyPickedString= arr [Math.floor(Math.random() * arr.length)];console.log(randomlyPickedString);

Способ 2:

  • Метод random(a, b) используется для генерации числа от (a до b, b исключая).
  • Взятие значения пола для диапазона чисел от (1 до arrayLength).
  • Вычтите 1, чтобы получить индекс в диапазоне от (0 до arrayLength-1).

const arr = ["фу","бар"];
const randomlyPickedString= arr [Math.floor(random(1, 5))-1];console.log(randomlyPickedString);

Добавив метод к прототипу массива, вы можете легко получить случайные значения.

В этом примере вы можете получить одно или несколько случайных значений из массива.

Вы можете запустить тестовый код, нажав кнопку фрагмента.

Array.prototype.random = function(n){
  if(n&&n>1){
    const a = [];
    for(let i = 0;i<n;i++){
      a.push(this[Math.floor(Math.random()*this.length)]);
    }
    return a;
  } else {
    return this[Math.floor(Math.random()*this.length)];
  }
}

const mySampleArray =  ['a','b','c','d','e','f','g','h'];

mySampleArray.random(); // return any random value etc. 'a', 'b'
mySampleArray.random(3); //retun an array with random values etc: ['b','f','a'] , ['d','b','d']

alert(mySampleArray.random());
alert(mySampleArray.random(3));

Эта работа как очарование для меня без каких-либо повторений.

   var Random_Value = Pick_Random_Value(Array);

function Pick_Random_Value(IN_Array) 
{
    if(IN_Array != undefined && IN_Array.length > 0)
    {
        var Copy_IN_Array = JSON.parse(JSON.stringify(IN_Array));
        if((typeof window.Last_Pick_Random_Index !== 'undefined') && (window.Last_Pick_Random_Index !== false))
        {
            if(Copy_IN_Array[Last_Pick_Random_Index] != undefined)
            {
                Copy_IN_Array.splice(Last_Pick_Random_Index,1);
            }
        }

        var Return_Value = false;

        if(Copy_IN_Array.length > 0)
        {
            var Random_Key = Math.floor(Math.random() * Copy_IN_Array.length);
            Return_Value = Copy_IN_Array[Random_Key];
        }
        else
        {
            Return_Value = IN_Array[Last_Pick_Random_Index];
        }

        window.Last_Pick_Random_Index = IN_Array.indexOf(Return_Value);
        if(window.Last_Pick_Random_Index === -1)
        {
            for (var i = 0; i < IN_Array.length; i++) 
            {
                if (JSON.stringify(IN_Array[i]) === JSON.stringify(Return_Value)) 
                {
                    window.Last_Pick_Random_Index = i;
                    break;
                }
            }
        }


        return Return_Value;
    }
    else
    {
        return false;
    }
}

Общий способ получить случайный элемент (ы):

let some_array = ['Jan', 'Feb', 'Mar', 'Apr', 'May'];
let months = random_elems(some_array, 3);

console.log(months);

function random_elems(arr, count) {
  let len = arr.length;
  let lookup = {};
  let tmp = [];

  if (count > len)
    count = len;

  for (let i = 0; i < count; i++) {
    let index;
    do {
      index = ~~(Math.random() * len);
    } while (index in lookup);
    lookup[index] = null;
    tmp.push(arr[index]);
  }

  return tmp;
}

Вот пример того, как это сделать:

$scope.ctx.skills = data.result.skills;
    $scope.praiseTextArray = [
    "Hooray",
    "You\'re ready to move to a new skill", 
    "Yahoo! You completed a problem", 
    "You\'re doing great",  
    "You succeeded", 
    "That was a brave effort trying new problems", 
    "Your brain was working hard",
    "All your hard work is paying off",
    "Very nice job!, Let\'s see what you can do next",
    "Well done",
    "That was excellent work",
    "Awesome job",
    "You must feel good about doing such a great job",
    "Right on",
    "Great thinking",
    "Wonderful work",
    "You were right on top of that one",
    "Beautiful job",
    "Way to go",
    "Sensational effort"
  ];

  $scope.praiseTextWord = $scope.praiseTextArray[Math.floor(Math.random()*$scope.praiseTextArray.length)];

это очень просто

      const randomNum = arr[Math.floor(Math.random() * arr.length)];

На мой взгляд, лучше, чем возиться с прототипами или объявлять их вовремя, я предпочитаю выставлять их в окне:

window.choice = function() {
  if (!this.length || this.length == 0) return;
  if (this.length == 1) return this[0];
  return this[Math.floor(Math.random()*this.length)];
}

Теперь в любом месте вашего приложения вы называете это как:

var rand = window.choice.call(array)

Таким образом, вы все еще можете использовать for(x in array) петля правильно

randojs делает это немного более простым и читаемым:

console.log( rando(['January', 'February', 'March']).value );
<script src="https://randojs.com/1.0.0.js"></script>

Другие вопросы по тегам