Создать массив со случайными значениями
Как создать массив из 40 элементов со случайными значениями от 0 до 39?
Как
[4, 23, 7, 39, 19, 0, 9, 14 ...]
Я попытался использовать решения здесь:
http://freewebdesigntutorials.com/javaScriptTutorials/jsArrayObject/randomizeArrayElements.htm
но массив, который я получаю, очень мало рандомизирован. Он генерирует много блоков последовательных чисел...
Ответы
Ответ 1
Вот решение, которое перетасовывает список уникальных чисел (без повторений, когда-либо).
for (var a=[],i=0;i<40;++i) a[i]=i;
// http://stackoverflow.com/questions/962802#962890
function shuffle(array) {
var tmp, current, top = array.length;
if(top) while(--top) {
current = Math.floor(Math.random() * (top + 1));
tmp = array[current];
array[current] = array[top];
array[top] = tmp;
}
return array;
}
a = shuffle(a);
Если вы хотите разрешить повторяющиеся значения (это не то, что нужно OP), посмотрите в другом месте.:)
Ответ 2
Самый короткий подход (ES6)
// randomly generated N = 40 length array 0 <= A[N] <= 39
Array.from({length: 40}, () => Math.floor(Math.random() * 40));
Наслаждайтесь!
Ответ 3
ES5:
function randomArray(length, max) {
return Array.apply(null, Array(length)).map(function() {
return Math.round(Math.random() * max);
});
}
ES6:
randomArray = (length, max) => [...new Array(length)]
.map(() => Math.round(Math.random() * max));
Ответ 4
Даже более короткий подход ES6:
Array(40).fill().map(() => Math.round(Math.random() * 40))
Кроме того, у вас может быть функция с аргументами:
const randomArray = (length, max) =>
Array(length).fill().map(() => Math.round(Math.random() * max))
Ответ 5
Math.random()
будет возвращать число от 0 до 1 (исключение). Итак, если вы хотите 0-40, вы можете его увеличить на 40, самым высоким результатом может быть то, что вы умножаете на.
var arr = [];
for (var i=0, t=40; i<t; i++) {
arr.push(Math.round(Math.random() * t))
}
document.write(arr);
http://jsfiddle.net/robert/tUW89/
Ответ 6
Самый короткий :-)
[...Array(40)].map(e=>~~(Math.random()*40))
Ответ 7
.. массив, который я получаю, очень мало рандомизирован. Он генерирует много блоков последовательных чисел...
Последовательности случайных элементов часто содержат блоки последовательных чисел, см. "Ошибка игрока" . Например:
.. мы просто бросили четыре головы подряд. Поскольку вероятность пробег из пяти последовательных голов - это только 1/32.. лицо, подпадающее под действие ошибка игрока может показаться, что этот следующий флип был менее вероятен быть головами, чем быть хвостами. http://en.wikipedia.org/wiki/Gamblers_fallacy
Ответ 8
Поскольку диапазон чисел ограничен, я бы сказал, что лучше всего сгенерировать массив, заполнить его цифрами от 0 до 39 (по порядку), а затем перетасовать его.
Ответ 9
Выполните однолинейные решения Quirk на каждый день.
Значения в массивах являются суммарными случайными, поэтому, когда вы будете использовать эти фрагменты, это будет отличаться.
Массив (длина 10) со случайными символами в нижнем регистре
Array.apply(null, Array(10)).map(function() { return String.fromCharCode(Math.floor(Math.random() * (123 - 97) + 97)); })
['k', 'a', 'x', 'y', 'n', 'w', 'm', 'q', 'b', 'j']
Массив (длина 10) со случайными целыми числами от 0 до 99
Array.apply(null, Array(10)).map(function() { return Math.floor(Math.random() * 100 % 100); })
[86, 77, 83, 27, 79, 96, 67, 75, 52, 21]
Случайные даты массива (от 10 лет назад до настоящего времени)
Array.apply(null, Array(10)).map(function() { return new Date((new Date()).getFullYear() - Math.floor(Math.random() * 10), Math.floor(Math.random() * 12), Math.floor(Math.random() * 29) )})
[2008-08-22T21: 00: 00.000Z, 2007-07-17T21: 00: 00.000Z,
2015-05-05T21: 00: 00.000Z, 2011-06-14T21: 00: 00.000Z,
2009-07-23T21: 00: 00.000Z, 2009-11-13T22: 00: 00.000Z,
2010-05-09T21: 00: 00.000Z, 2008-01-05T22: 00: 00.000Z,
2016-05-06T21: 00: 00.000Z, 2014-08-06T21: 00: 00.000Z]
Массив (длина 10) случайных строк
Array.apply(null, Array(10)).map(function() { return Array.apply(null, Array(Math.floor(Math.random() * 10 + 3))).map(function() { return String.fromCharCode(Math.floor(Math.random() * (123 - 97) + 97)); }).join('') });
['cubjjhaph', 'Bmwy', 'Alhobd', 'Ceud', 'Tnyullyn', 'Vpkdflarhnf', "ХВГ", 'Arazuln', 'Jzz', 'cyx']
Другие полезные вещи, которые вы можете найти здесь https://github.com/setivolkylany/nodejs-utils/blob/master/utils/faker.js
Ответ 10
var myArray = [];
var arrayMax = 40;
var limit = arrayMax + 1;
for (var i = 0; i < arrayMax; i++) {
myArray.push(Math.floor(Math.random()*limit));
}
Это традиционный способ сделать это, но я второй @Pointy и @Phrogz, если вы хотите избежать дубликатов в своем массиве, не выполняя дорогостоящих вычислений
Ответ 11
Используя некоторые новые функции ES6, теперь это можно достичь, используя:
function getRandomInt(min, max) {
"use strict";
if (max < min) {
// Swap min and max
[min, max] = [min, max];
}
// Generate random number n, where min <= n <= max
let range = max - min + 1;
return Math.floor(Math.random() * range) + min;
}
let values = Array.from({length: 40}, () => getRandomInt(0, 40));
console.log(values);
Обратите внимание, что это решение будет работать только в современных браузерах, которые поддерживают эти функции ES6: функции стрелок и Array.from().
Ответ 12
let randomNumber = Array.from({length: 6},() => Math.floor(Math.random() * 39));
ограничил массив до 6 значений, чтобы было легко увидеть.
Ответ 13
со страницы, предложенной @Phrogz
for (var i=0,nums=[];i<49;i++) nums[i]={ n:i, rand:Math.random() };
nums.sort( function(a,b){ a=a.rand; b=b.rand; return a<b?-1:a>b?1:0 } );
Ответ 14
Мне нужно было что-то немного отличающееся от того, что давали эти решения, поскольку мне нужно было создать массив с рядом различных случайных чисел, удерживаемых в указанном диапазоне. Ниже мое решение.
function getDistinctRandomIntForArray(array, range){
var n = Math.floor((Math.random() * range));
if(array.indexOf(n) == -1){
return n;
} else {
return getDistinctRandomIntForArray(array, range);
}
}
function generateArrayOfRandomInts(count, range) {
var array = [];
for (i=0; i<count; ++i){
array[i] = getDistinctRandomIntForArray(array, range);
};
return array;
}
Я бы предпочел не создавать цикл, у которого есть возможность получить много ненужных вызовов (если ваш счет и диапазон высоки и близки к одному номеру), но это лучшее, что я мог бы сделать с.
Ответ 15
function shuffle(maxElements) {
//create ordered array : 0,1,2,3..maxElements
for (var temArr = [], i = 0; i < maxElements; i++) {
temArr[i] = i;
}
for (var finalArr = [maxElements], i = 0; i < maxElements; i++) {
//remove rundom element form the temArr and push it into finalArrr
finalArr[i] = temArr.splice(Math.floor(Math.random() * (maxElements - i)), 1)[0];
}
return finalArr
}
Я предполагаю, что этот метод решит проблему с вероятностями, ограниченную только генератором случайных чисел.
Ответ 16
Если вам это нужно со случайными уникальными значениями от 0... длина диапазона:
const randomRange = length => {
const results = []
const possibleValues = Array.from({ length }, (value, i) => i)
for (let i = 0; i < length; i += 1) {
const possibleValuesRange = length - (length - possibleValues.length)
const randomNumber = Math.floor(Math.random() * possibleValuesRange)
const normalizedRandomNumber = randomNumber !== possibleValuesRange ? randomNumber : possibleValuesRange
const [nextNumber] = possibleValues.splice(normalizedRandomNumber, 1)
results.push(nextNumber)
}
return results
}
randomRange(5) // [3, 0, 1, 4, 2]
Ответ 17
Я уверен, что это самый короткий способ создать ваш случайный массив без повторов
var random_array = new Array(40).fill().map((a, i) => a = i).sort(() => Math.random() - 0.5);