我该如何创建一个由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
但是我得到的数组随机化程度很低。它生成了许多连续数字块...
我需要的东西与这些解决方案略有不同,因为我需要创建一个包含指定范围内多个不同随机数的数组。以下是我的解决方案。
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;
}
我本来更喜欢不创建一个循环,因为它可能会产生大量不必要的调用(如果您的计数和范围很高并且接近相同的数字),但这是我能想到的最好的方法。
console.log(randoSequence(40));
<script src="https://randojs.com/1.0.0.js"></script>
没有所有物流上的麻烦 - 而且它非常易读和易懂 :)
一个长度为40的数组,包含40个可能的随机值(0-39),且没有重复值,最好像@Phrogz和@Jared Beck所解释的那样对其进行洗牌。 另一种方法,仅供记录,可以使用生成器。但是与其他提出的解决方案相比,这种方法缺乏性能。
function* generateRandomIterable(n, range) {
for (let i = 0; i < n; i++) {
yield ~~(Math.random() * range);
}
}
const randomArr = [...generateRandomIterable(40,40)];
const createRandomNumbers = (min, max) => {
const randomNumbers = new Set()
const range = max - min + 1
while (randomNumbers.size < range) {
randomNumbers.add(~~(Math.random() * range))
}
return [...randomNumbers]
}