如何从不包括某些给定数字的数组中生成随机数[重复]

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,如果您不想返回值,这是最佳实践,或者考虑使用filterindexOf。但这不是真的与您的问题相关)

【讨论】:

以上是关于如何从不包括某些给定数字的数组中生成随机数[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何获得某些数据的“形状”,以便可以在 numpy/scipy 中生成类似的随机数 [重复]

在Java中生成字母数字随机字符串[重复]

如何在java中生成一个随机的15位长[重复]

如何在数组中生成随机数,加起来达到定义的总数?

使用循环在数组中生成唯一的随机数

编译器显示错误消息“从不强制转换的整数中生成指针”(反转数组)。我该如何解决这个问题? [关闭]