【问题标题】:Creating array of length n with random numbers in JavaScript在 JavaScript 中使用随机数创建长度为 n 的数组
【发布时间】:2016-04-30 05:15:49
【问题描述】:

this answer 创建指定长度的数组之后,我执行了以下操作以获得相应的结果,但填充的是随机数,而不是零。

var randoms = Array(4).fill(Math.floor(Math.random() * 9));

嗯,从数学上讲它是随机的,好吧。但我希望随机性在数组中可见,当然不仅仅是在运行之间。愚蠢的电脑...不要照我说的做。做我想做的事!

我可以迭代并将其放入我的随机(和变化)值。但是,出于纯粹的好奇,我想知道是否有可能使用单线(如上面的 MatLab 风格)获得正确的结果。我需要调用 eval(function()...) 吗?我听说过很多关于 eval 的坏话...

请注意,上面生成的代码如下:

[7, 7, 7, 7]
[3, 3, 3, 3]

等等。虽然我想要类似的东西

[1、2、3、4]
[4、3、8、4]

【问题讨论】:

  • 我不明白但我希望随机性在数组中可见,当然不仅仅是在运行之间。 AFAIU,你只想用随机数创建一个长度为n 的数组。
  • @Tushar 如果您在控制台中运行该行,您会看到...它会创建 单个 随机数并将其作为修复数复制到所有位置.首先,当您再次运行时,您将获得一组其他数字(每次运行都相同)。很容易错过吧?我已经更新了这个问题。谢谢。
  • “fill() 方法使用静态 [sic!] 值填充数组的所有元素,从开始索引到结束索引。” MDN
  • @NinaScholz 是的,这就是我所认识的。这是一个随机值。诚然。但不是我想要的。我记得一位老师声称没有仅生成素数的功能。我用 function(){ return 13; 反驳了他。 } 他不高兴。其他人都被逗乐了。

标签: javascript arrays random


【解决方案1】:

Array#fill 是做什么的?

根据 MDN

fill() 方法用静态值填充数组中从开始索引到结束索引的所有元素。

您可以使用Function#applyArray#mapMath.floor()Math.random()

在 ES6 中,Array#fromArrow function 可以使用。

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

Array.apply(null, Array(6)).map(() => Math.floor(Math.random() * 9));

var randomArr = Array.from({length: 6}, () => Math.floor(Math.random() * 9));

document.getElementById('result').innerHTML = JSON.stringify(randomArr, 0, 4); // For demo only
<pre id="result"></pre>

在 ES5 中:

Array.apply(null, Array(6)).map(function(item, index){
    return Math.floor(Math.random() * 9);
});

var randomArr = Array.apply(null, Array(6)).map(function(item, index){
    return Math.floor(Math.random() * 9)
});

document.getElementById('result').innerHTML = JSON.stringify(randomArr, 0, 4);
<pre id="result"></pre>

Array.apply(null, Array(n)) 是什么? new Array(n)可以用在这里吗?

上面的代码都创建了六个元素的新数组,每个元素的值都是undefined。但是,当使用new 语法时,创建的数组是不可迭代的。为了使数组可迭代,使用Array.apply(null, Array(6)) 语法。


如果您在页面上包含lodash,那真的很容易。

_.times(6, _.random.bind(0, 100))
        ^                        - Number of elements in array
                         ^       - Random number range min
                            ^^^  - Random number range max

注意:这个答案的灵感来自Colin Toh's blog

【讨论】:

  • 使用 ES2015 你也可以这样做:Array.from({length: 6}, () => Math.floor(Math.random() * 9))
  • 谢谢@NicolaBizzoca。不知道那个。更新了答案。
【解决方案2】:
var randoms = Array(4).fill(Math.floor(Math.random() * 9));

这行代码将创建一个包含 4 个相同数字的列表,因为 fill 采用单个值并在列表的长度内重复它。您要做的是每次运行随机数生成器:

var makeARandomNumber = function(){
    return Math.floor(Math.random() * 9);
}
var randoms = Array(5).fill(0).map(makeARandomNumber);
console.log(randoms)
// => [4, 4, 3, 2, 6]

https://jsfiddle.net/t4jtjcde/

【讨论】:

  • 是的,我明白了。我只是不确定为什么@Tushar 在那里使用 apply() 。似乎没有它我会得到相同的结果,但我足够谨慎,知道这里和那里可能有龙。另外,我想知道您为什么在 fill() 中使用零参数。如果没有它,我似乎得到了相同的结果(尝试 fill(null) 和简单的 fill())。是不是更好的风格?它会阻止某些事情发生吗?
  • refill(0),只是想给它一些东西,没有真正的计划。重新 Tushar 使用 apply(),他们提到他们这样做是为了使数组可迭代。我没有使用它来测试这种行为,但并非所有对象都以您期望的方式响应 javascript 的内置循环结构,因为有时某些东西看起来像一个数组,而实际上它是一个具有索引属性的对象。我选择忽略这些细节,只使用 lodash 来处理所有事情
【解决方案3】:

`const t = Array.from({length: n}, mapArrowFx);

1) const t10 = Array.from({length: 10}, (v, k) => k); [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

2) const tEven = Array.from({length: 10}, (v, k) => 2*k); [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

........

3)

let n=100; const tRandom= Array.from({length: n}, (v, k) => Math.floor(Math.random()*n));

...

【讨论】:

  • 嗯...你确定这是一个正确的回复吗,伙计?似乎有点……随机。
【解决方案4】:

简短而简单的 ES6 方法 -

// randomly generated n = 4 length array 0 <= array[n] <= 9
var randoms = Array.from({length: 4}, () => Math.floor(Math.random() * 10));

享受吧!

【讨论】:

  • 这里的 {length: 4} 到底是什么?搜索只会提取字符串长度属性.length,我认为这是一种不同的结构。
  • 如果我们提供一个包含长度属性的对象作为第一个参数,则 Array.from() 知道它可以生成一个数字序列。在这里阅读 - developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
【解决方案5】:

我想知道是否有可能用单线得到正确的结果......

var randoms = [...Array(4)].map(() => Math.floor(Math.random() * 9));

document.body.innerText = randoms;

【讨论】:

    【解决方案6】:

    来自Sized array of random unique numbers的解决方案

    const uniqRandomNumbers  = _.sampleSize(_.range(9), 4);
    console.log(uniqRandomNumbers);
    &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.min.js"&gt;&lt;/script&gt;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-26
      • 2021-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-03
      • 2019-02-06
      • 1970-01-01
      相关资源
      最近更新 更多