创建一个具有随机值的数组

IT技术 javascript arrays random
2021-01-18 06:01:54

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

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

我尝试使用这里的解决方案:

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

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

6个回答

最短方法(ES6)

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

享受!

如果我们从答案的方法中删除空格,它会比您建议的少 4 个字符。当然,如果你对打高尔夫球感兴趣,你实际上遗漏了一些简单的字符剪切快捷方式:[...Array(40)].map(_=>Math.ceil(Math.random()*40));比你的少 11 个字符,比原来的少 7 个字符。
2021-03-19 06:01:54
你说的对。删除了我的评论。实际最短路径的更正版本:[...Array(20)].map(()=>{return Math.floor(Math.random()*30)});
2021-04-10 06:01:54
(纠正速度不够快——如果我们使用Math.ceil则需要 *39 才能满足 OP 的标准,尽管我们删除了 0 作为选项。如果我们可以接受 1-40 而不是 0-39,这有效。否则, 减少返回到Math.floor)的改进字符
2021-04-12 06:01:54

这是一个对唯一数字列表进行洗牌的解决方案(永远不会重复)。

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 想要的),请查看其他地方。:)

var random_array = new Array(40).fill().map((a, i) => a = i).sort(() => Math.random() - 0.5); 我认为这和上面的一样
2021-03-24 06:01:54
如何从生成数字 0 中排除它?
2021-03-25 06:01:54
这是一个 ES6 版本,它允许您具有一定的最小/最大灵活性,但仍然为您提供一组唯一数字:pastie.org/p/069IAzSzsRhN6JXdAIpPhc
2021-04-01 06:01:54
如果数字应该是唯一的,则此解决方案很好,但这是完全不同的统计/概率问题。我希望这对 OP 来说是清楚的,并且与他们的情况无关,但在某些情况下,它会对程序的正确性产生重大影响。(我不是在批评答案,只是为未来的读者竖起一面旗帜。你可能想提到这一点。)另见:en.wikipedia.org/wiki/Combination(“有”或“无重复”之间的区别)
2021-04-14 06:01:54

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));
我不知道你认为 ES6 的版本在哪?Array.from 作品...这是您的代码示例... randomArray = (length: number, max: number) => Array.from({length}) .map(() => Math.floor(Math .random() * 最大值));
2021-03-17 06:01:54
@AfricanMatt,_是当前元素,i是当前索引。你是对的,在这两种情况下它们都是不必要的。如果您愿意,可以删除它们。
2021-03-19 06:01:54
有什么用的最多_i论证?除非我弄错了,否则在 ES6 中是不必要的。
2021-04-06 06:01:54

更短的 ES6 方法:

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

此外,你可以有一个带参数的函数:

const randomArray = (length, max) => 
  Array(length).fill().map(() => Math.round(Math.random() * max))
@DamianGreen -.fill()没有任何参数将用 填充数组undefined,这是这里唯一需要的东西.map()才能工作
2021-03-16 06:01:54
@Henrique 使用变量?🤔
2021-03-29 06:01:54
@Damjan 有没有办法不重复数字?喜欢这种方法
2021-04-04 06:01:54
.fill() 需要一个值参数
2021-04-12 06:01:54
@Sebj 这可能吗?我的意思是,任何像这样短的方法以及道具作为长度和最大值对我来说都是完美的:)
2021-04-12 06:01:54

最短的:-)

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

@AJUppal OP 要求提供 0-39 的具体示例,因此请关闭它
2021-03-16 06:01:54
可悲的是,不是一个“简短”的答案。他笑着回答。
2021-03-25 06:01:54
这很棒; 这种~~速记是否有广泛的支持(编辑:啊,它只是一个按位运算符,我明白了)
2021-03-30 06:01:54
~~ 是 Math.floor 的简写
2021-04-05 06:01:54
@Curt 仅适用于正数
2021-04-09 06:01:54