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

时间:2011-04-29 20:05:06

标签: javascript arrays random

如何创建一个包含40个元素的数组,随机值从0到39? 像

[4, 23, 7, 39, 19, 0, 9, 14 ...]

我尝试使用此处的解决方案:

http://freewebdesigntutorials.com/javaScriptTutorials/jsArrayObject/randomizeArrayElements.htm

但我获得的数组很少随机。它产生了许多连续数字的块......

23 个答案:

答案 0 :(得分:102)

  

最短的方法(ES6)

// randomly generated N = 40 length array 0 <= A[N] <= 39
Array.from({length: 40}, () => Math.floor(Math.random() * 40));
  

享受!

答案 1 :(得分:36)

这是一个解决方案,可以随机播放唯一号码列表(无需重复)。

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 :(得分:36)

ES5:

Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.
C:\Anaconda3>python.exe
Python 3.4.3 |Anaconda 2.3.0 (64-bit)| (default, Mar  6 2015, 12:06:10) [MSC v.1
600 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import pyglet #No problem!
>>> pyglet.image.ImageData #Heavy CPU load until I exit python
<class 'pyglet.image.ImageData'>

ES6:


for dest in A62PD{R,S,L,X,Y}_BLACK.png
do
    cp A62PD_BLACK.png "${dest}"
done

答案 3 :(得分:20)

更短的ES6方法:

Array(40).fill().map(() => Math.round(Math.random() * 40))

此外,您可以使用带参数的函数:

const randomArray = (length, max) => 
  Array(length).fill().map(() => Math.round(Math.random() * max))

答案 4 :(得分:14)

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/

答案 5 :(得分:10)

  

..我得到的数组很少随机。它产生了许多连续数字的块......

随机项的序列通常包含连续数字的块,请参阅Gambler's Fallacy。例如:

  

..我们刚刚连续扔了四个头。因为概率   一连串五个连续的头只有1/32 ..一个人受到了   赌徒的谬误可能会让人觉得下一次翻转的可能性更小   是头,而不是尾巴。   http://en.wikipedia.org/wiki/Gamblers_fallacy

答案 6 :(得分:8)

最短的:-)

[...Array(40)].map(e=>~~(Math.random()*40))

答案 7 :(得分:3)

每天推出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',         'HVG',         'arazuln',         'JZZ',         'cyx']

您可以在此处找到其他有用的内容https://github.com/setivolkylany/nodejs-utils/blob/master/utils/faker.js

答案 8 :(得分:3)

由于数字范围受到限制,我要说最好的事情是生成数组,用数字0到39填充(按顺序),然​​后将其洗牌。

答案 9 :(得分:2)

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 :(得分:1)

只需两行代码即可生成包含 10 个随机数的数组。

let result = new Array(10)
result = result.fill(0).map(() => Math.random());

而且只是。

console.log(vals);

答案 11 :(得分:1)

使用一些新的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 :(得分:1)

let randomNumber = Array.from({length: 6}, () => Math.floor(Math.random() * 39));

将数组限制为6个值,以便于查看。

答案 13 :(得分:1)

请参阅以下内容:-

let arr = Array.apply(null, {length: 1000}).map(Function.call, Math.random)
/* will create array with 1000 elements */

答案 14 :(得分: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]

答案 15 :(得分:0)

由于*的优先级高于|,因此可以使用|0替换Math.floor()来缩短优先级。

[...Array(40)].map(e=>Math.random()*40|0)

答案 16 :(得分:0)

这是一个ES6函数,它允许一个最小值和一个最大值,并将以随机顺序生成一个唯一值数组,其中包含从最小值到最大值(包括端值)的所有数字:

const createRandomNumbers = (min, max) => {
  const randomNumbers = new Set()
  const range = max - min + 1

  while (randomNumbers.size < range) {
    randomNumbers.add(~~(Math.random() * range))
  }

  return [...randomNumbers]
}

答案 17 :(得分:0)

发电机

如@Phrogz和@Jared Beck所解释的,长度为40的数组,其中包含40个可能的随机值(0-39),无需重复值,最好将其改组。 仅用于记录的另一种方法可能是使用生成器。但是与其他提议的解决方案相比,这种方法缺乏性能

function* generateRandomIterable(n, range) {
  for (let i = 0; i < n; i++) {
    yield ~~(Math.random() * range);
  }
}
const randomArr = [...generateRandomIterable(40,40)];

答案 18 :(得分:0)

聚会晚了一点,但是我使用randojs.com来保证随机性,因为它使像这样的事情变得非常容易。您可以像这样从0到39随机抽取一组数字:

console.log(randoSequence(40));
<script src="https://randojs.com/1.0.0.js"></script>

无需大惊小怪,而且它具有超强的可读性和易懂性:)

答案 19 :(得分:0)

我很确定这是创建随机数组而不重复的最短方法

var random_array = new Array(40).fill().map((a, i) => a = i).sort(() => Math.random() - 0.5);

答案 20 :(得分: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 } );

答案 21 :(得分:0)

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
}

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

答案 22 :(得分: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; 
}

我宁愿不创建一个循环,有可能最终得到很多不必要的调用(如果你的数量和范围很高并且接近相同的数字)但这是我能来的最好的起来。