如何创建一个包含40个元素的数组,其随机值介于0到39之间?喜欢
[4, 23, 7, 39, 19, 0, 9, 14, ...]
我尝试从这里使用解决方案:
http://freewebdesigntutorials.com/javaScriptTutorials/jsArrayObject/randomizeArrayElements.htm
但是我得到的数组很少是随机的。它会产生很多连续数字的方块...
如何创建一个包含40个元素的数组,其随机值介于0到39之间?喜欢
[4, 23, 7, 39, 19, 0, 9, 14, ...]
我尝试从这里使用解决方案:
http://freewebdesigntutorials.com/javaScriptTutorials/jsArrayObject/randomizeArrayElements.htm
但是我得到的数组很少是随机的。它会产生很多连续数字的方块...
Answers:
这是一种解决方案,它可以打乱唯一编号的列表(永远不会重复)。
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想要的值),请在其他地方查找。:)
最短的方法(ES6)
// randomly generated N = 40 length array 0 <= A[N] <= 39
Array.from({length: 40}, () => Math.floor(Math.random() * 40));
请享用!
[...Array(40)].map(_=>Math.ceil(Math.random()*40));
将比您的字符少11个字符,比原始字符少7个字符。
Math.ceil
,则必须为* 39才能满足OP的标准,尽管我们将0切除为一个选项。如果我们可以接受1-40而不是0-39,则可以使用。否则,请减少回溯的改进时间Math.floor
)
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));
_
和i
论证?除非我弄错了,否则在ES6中不需要。
_
是当前元素,i
也是当前索引。没错,在两种情况下它们都是不必要的。您可以根据需要删除它们。
更短的ES6方法:
Array(40).fill().map(() => Math.round(Math.random() * 40))
另外,您可以使用带有参数的函数:
const randomArray = (length, max) =>
Array(length).fill().map(() => Math.round(Math.random() * max))
.fill()
没有任何参数将使用填充数组undefined
,这是这里唯一需要.map()
工作的东西
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);
..我得到的数组很少是随机的。它会产生很多连续数字的方块...
随机项目的序列通常包含连续的数字块,请参阅“ 赌徒的谬误”。例如:
..我们刚刚连续扔了四个脑袋..由于连续五个脑袋运行的概率仅为1⁄32 ..受赌徒谬论的人可能会认为,下一次翻转的可能性小于成为尾巴。 http://en.wikipedia.org/wiki/Gamblers_fallacy
由于数字范围受到限制,我想说的最好的方法是生成数组,将数字从0到39(按顺序)填充,然后将其随机播放。
Math.random()
40次相比,结果会略有不同,因为它将强制每个数字出现一次且不会重复。
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
每天都有古怪的单行解决方案。
数组中的值是完全随机的,因此当您使用此代码段时,它将有所不同。
小写随机字符的数组(长度为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,'hvg','arazuln','jzz','cyx']
您可能会在这里找到其他有用的东西https://github.com/setivolkylany/nodejs-utils/blob/master/utils/faker.js
使用一些新的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()。
请参阅以下内容:
let arr = Array.apply(null, {length: 1000}).map(Function.call, Math.random)
/* will create array with 1000 elements */
从@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 } );
我需要的东西与这些解决方案所提供的东西有所不同,因为我需要创建一个数组,其中将多个不同的随机数保持在指定范围内。下面是我的解决方案。
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;
}
我希望不要创建一个循环,该循环有可能导致大量不必要的调用(如果您的计数和范围很高并且接近相同的数字),但这是我能想到的最好的循环。
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
}
我猜想这种方法将解决概率问题,仅受随机数生成器限制。
如果您需要从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]