创建一个包含随机值的数组。

170
24个回答

5

使用一些新的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())的现代浏览器。

5

由于数字范围受限,我建议最好的方法是生成数组,用0到39(顺序)填充它,然后对其进行洗牌。


这是该技术的可视化实现(尽管该页面使用了可怕的洗牌算法)。 - Phrogz
我不知道他是否想要每个数字之间的所有数字,还是完全随机的?如果他可以接受随机顺序、静态值,那么这将很好地工作。 - Robert
这可能会完成任务,但与使用 Math.random() 40 次会产生略微不同的结果,因为它将强制每个数字只出现一次且不重复。 - Mu Mind

3
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的看法,如果你想避免在数组中出现重复项而不必进行昂贵的计算。

3

每天都可以使用奇怪的单行解决方案。

数组中的值是完全随机的,因此当您使用这些代码片段时,它们将不同。

一个包含小写随机字符的数组(长度为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


2

使用 Es6

选项1

new Array(40).fill(0).map(_ => Math.random() * 40 | 0)

创建一个长度为40的空数组,然后用0填充它,再将0替换为随机数。 Math.random() 生成浮点数,需要转换为整数,可以使用按位或(|)运算符。
[...Array(40)].map(_ => Math.random() * 40 | 0)

使用[...Array(40)]代替new Array(40).fill(0)——它将克隆长度为40的空(undefined)数组。

选项3

使用Array.from

Array.from(arrayLike, mapFn)

arrayLike

要转换为数组的类似数组或可迭代对象。

mapFn(可选)

在数组的每个元素上调用的映射函数。

Array.from({length: 10}, () => Math.floor(Math.random() * 100));

如果你想填充独特的随机数

我们将使用Set来实现,因为我们知道集合只允许添加唯一的值。

let set = new Set();
while (set.size <= 40) {
  set.add((Math.random() * 400) | 0);
}
let randomArray = [...set];

但是有一点很重要,那就是您需要乘以比数组长度更大的数字……否则生成唯一数字的时间太长,可能会导致执行冻结很长时间。尝试取比我这里取的400大10倍的数字。


1
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
}

我猜这种方法可以解决与概率相关的问题,只受随机数生成器的限制。

1
请参考以下内容:
let arr = Array.apply(null, {length: 1000}).map(Function.call, Math.random)
/* will create array with 1000 elements */

1
我很确定这是创建随机数组的最短方式,而且不会有重复项。
var random_array = new Array(40).fill().map((a, i) => a = i).sort(() => Math.random() - 0.5);

"相当确定",如何使用 keys 函数: Array.from(Array(40).keys()).sort(_ => Math.random() - .5)? 你甚至可以疯狂地使用展开运算符!但现在对我来说太激动人心了。 - Yeti

0
如果您需要从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]

0

从@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 } );

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接