我该如何创建一个由40个元素组成的数组,并且数组中的值是0到39之间的随机数?
[4, 23, 7, 39, 19, 0, 9, 14, ...]
我尝试使用这里的解决方案:
http://freewebdesigntutorials.com/javaScriptTutorials/jsArrayObject/randomizeArrayElements.htm
但是我得到的数组随机化程度很低。它生成了许多连续数字块...
我该如何创建一个由40个元素组成的数组,并且数组中的值是0到39之间的随机数?
[4, 23, 7, 39, 19, 0, 9, 14, ...]
我尝试使用这里的解决方案:
http://freewebdesigntutorials.com/javaScriptTutorials/jsArrayObject/randomizeArrayElements.htm
但是我得到的数组随机化程度很低。它生成了许多连续数字块...
最短的方法(ES6):
// randomly generated N = 40 length array 0 <= A[N] <= 39
Array.from({length: 40}, () => Math.floor(Math.random() * 40));
下面是一种解决方案,可以打乱一个列表中的唯一数字(永远不会重复)。
for (var a=[],i=0;i<40;++i) a[i]=i;
// https://dev59.com/WHNA5IYBdhLWcg3wcNXF
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);
如果你想允许重复的值(这不是问题提出者想要的),那么请寻找其他方法。 :)
最短的:
[...Array(40)].map(e=>~~(Math.random()*40))
XXX | 0
,但我觉得~~
更加简洁。 - CurtES5:
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));
_
是当前元素,i
是当前索引。你说得对,在这两种情况下都是不必要的。如果你愿意,可以将它们删除。 - Eugene Kulabuhov[...new Array(length)]
,而不是直接写 new Array(length)
呢? - MagneES6更简短的方法:
Array(40).fill().map(() => Math.round(Math.random() * 40))
此外,您可以创建一个带参数的函数:
const randomArray = (length, max) =>
Array(length).fill().map(() => Math.round(Math.random() * max))
.fill()
方法不带参数时,会用undefined
填充数组,在这里使用.map()
时只需要这个就可以了。 - vsyncMath.random()
会返回一个介于0和1(不包括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);
const randomNumber = Array.from({length: 6}, () => Math.floor(Math.random() * 39));
将数组限制为6个值以便更容易查看。
我得到的数组很少随机化。 它生成了许多连续数字块...
随机项序列经常包含连续数字块,参见赌徒谬误。例如:
..我们刚刚抛出了四个正面朝上的硬币..由于五个连续正面朝上的概率仅为1⁄32..一个受到赌徒谬误影响的人可能会认为下一次翻转比翻转尾巴更不可能是正面。 http://en.wikipedia.org/wiki/Gamblers_fallacy
由于*
比|
的优先级更高,因此可以使用|0
代替Math.floor()
来缩短代码。
[...Array(40)].map(e=>Math.random()*40|0)
您只需要两行代码就可以生成包含10个随机数字的数组。
let result = new Array(10)
result = result.fill(0).map(() => Math.random());
and just .
console.log(vals);
[...Array(40)].map(_=>Math.ceil(Math.random()*40));
比你的方法少11个字符,比原来的方法少7个字符。 - Kyle BakerMath.ceil
,则需要*39才能满足OP的要求,尽管我们将0作为一个选项剔除了。如果我们可以接受1-40而不是0-39,则可以这样做。否则,回到Math.floor
将减少一个字符的改进。 - Kyle Baker