如何从不包括某些给定数字的数组中生成随机数[重复]
Posted
技术标签:
【中文标题】如何从不包括某些给定数字的数组中生成随机数[重复]【英文标题】:How to generate random numbers from an array excluding some given numbers [duplicate] 【发布时间】:2020-06-29 12:00:53 【问题描述】:我正在开发一款游戏,玩家可以选择 1 到 36 之间的 6 个数字。 我要做的是创建一个新数组,排除 6 个选定的数字,新数组的长度为 30。
这就是我所做的。 生成的第一个数组:
var selectedBalls = [2, 8, 25, 13, 8, 5]; //take this as the selected balls for example
var totalBalls = [];
function getBallsReady()
for (var i = 1; i <= 36; i++)
totalBalls.push(i);
这是我尝试获取新数组的代码,但还不完美,因为所选 6 个数字中至少有 1 或 2 个数字仍然始终是新数组的一部分。
function generateNewBalls()
let clonedTotalBalls = [...totalBalls];
selectedBalls.map((ball) =>
clonedTotalBalls.splice(ball, 1);
)
我做错了什么?
【问题讨论】:
How to filter an array from all elements of another array的可能重复 【参考方案1】:可以这样实现
clonedTotalBalls = totalBalls.filter((element)=>!selectedBalls.includes(element))
filter
函数采用一个谓词,该谓词在每个元素上运行一次,并为每个元素返回一个布尔值。在这种情况下,谓词是元素是否包含在selectedBalls
数组中。因此,selectedBalls
数组中包含的所有元素都将返回 false,而所有其他元素都返回 true。 filter
也不会修改原始数组,而是创建一个新数组。
【讨论】:
谢谢!这也有效。我选择这个作为正确答案是因为它告诉我我不必克隆原始数组。 对于它的价值,这是一个更好的答案! @KaiSalmon 你的回答解决了我的问题,这个回答带来了另一种解决方案。全都一样。谢谢各位【参考方案2】:splice
删除特定索引处的元素,而不是特定值。
为了达到您想要的结果,您应该使用:
function generateNewBalls()
let clonedTotalBalls = [...totalBalls];
selectedBalls.map((ball) =>
let indexToRemove = clonedTotalBalls.indexOf(ball)
clonedTotalBalls.splice(indexToRemove, 1);
)
(我还建议您将map
更改为forEach
,如果您不想返回值,这是最佳实践,或者考虑使用filter
和indexOf
。但这不是真的与您的问题相关)
【讨论】:
以上是关于如何从不包括某些给定数字的数组中生成随机数[重复]的主要内容,如果未能解决你的问题,请参考以下文章