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

Ale*_*dra 71 javascript arrays random

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

[4, 23, 7, 39, 19, 0, 9, 14 ...]
Run Code Online (Sandbox Code Playgroud)

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

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

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

sim*_*bor 138

最短的方法(ES6)

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

请享用!

  • 如果我们从答案的方法中删除空格,则比您建议的字符少4个字符。当然,如果您对打高尔夫球感兴趣,那么实际上就省去了一些简单的切字符的快捷方式:`[... Array(40)]。map(_ =&gt; Math.ceil(Math.random()* 40 ));`比您的字符少11个字符,比原始字符少7个字符。 (6认同)

Phr*_*ogz 42

这是一个解决一个唯一数字列表的解决方案(无需重复).

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);
Run Code Online (Sandbox Code Playgroud)

如果你想允许重复的值(这不是OP想要的那样),那么看看其他地方.:)

  • 如果数字应该是唯一的,这个解决方案很好,但这是一个完全不同的统计/概率事情.我希望OP对此明确,并且与他们的案例无关,但在某些情况下,它会对程序的正确性产生重大影响.(我不是critizing答案,只是养标志未来的读者,您可能想提一提.)参见:https://en.wikipedia.org/wiki/Combination(区别"与"之间或"无重复" (4认同)

Eug*_*hov 40

ES5:

function randomArray(length, max) {
    return Array.apply(null, Array(length)).map(function() {
        return Math.round(Math.random() * max);
    });
}
Run Code Online (Sandbox Code Playgroud)

ES6:

randomArray = (length, max) => [...new Array(length)]
    .map(() => Math.round(Math.random() * max));
Run Code Online (Sandbox Code Playgroud)

  • @AfricanMatt,`_`是当前元素,`i`是当前索引.你是对的,在这两种情况下都没有必要.如果您愿意,可以删除它们. (2认同)
  • 我不知道你认为 ES6 版本在哪里可以工作?Array.from 有效...这是您的代码的示例... randomArray = (length: number, max: number) =&gt; Array.from({length}) .map(() =&gt; Math.floor(Math .random() * 最大)); (2认同)

Dam*_*ica 22

更短的ES6方法:

Array(40).fill().map(() => Math.round(Math.random() * 40))
Run Code Online (Sandbox Code Playgroud)

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

const randomArray = (length, max) => 
  Array(length).fill().map(() => Math.round(Math.random() * max))
Run Code Online (Sandbox Code Playgroud)

  • @DamianGreen - 不带任何参数的 `.fill()` 将会用 `undefined` 填充数组,这是 `.map()` 工作唯一需要的东西 (6认同)
  • .fill() 需要一个值参数 (2认同)

Cur*_*urt 19

最短的:-)

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

  • ~~是Math.floor的简写 (11认同)

Rob*_*ert 15

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);
Run Code Online (Sandbox Code Playgroud)

http://jsfiddle.net/robert/tUW89/


小智 11

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

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


Jar*_*eck 10

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

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

..我们刚刚连续扔了四个头.由于连续五个头的运行概率只有1/32 ..一个受赌徒谬误影响的人可能会认为这个下一次翻转的可能性不大于是尾巴. http://en.wikipedia.org/wiki/Gamblers_fallacy


小智 8

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

let result = new Array(10)
result = result.fill(0).map(() => Math.random());
Run Code Online (Sandbox Code Playgroud)

就这样。

console.log(vals);
Run Code Online (Sandbox Code Playgroud)


小智 7

因为*具有比 更高的优先级|,所以可以使用|0替换来更短Math.floor()

[...Array(40)].map(e=>Math.random()*40|0)
Run Code Online (Sandbox Code Playgroud)


Poi*_*nty 5

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


Lac*_*unt 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);
Run Code Online (Sandbox Code Playgroud)

请注意,此解决方案仅适用于支持以下 ES6 功能的现代浏览器:箭头函数和 Array.from()。