当前位置: 首页 > 知识库问答 >
问题:

Math.Floor和Math.Radom相差一个索引

越俊驰
2023-03-14

我在做一个小的抽风游戏。

当轮到电脑玩的时候,我让他选择一个随机数从一个数组中选择一个元素。

我的问题是,例如随机数将是3,但从数组中选择的元素将不是arr[3],而是arr[4]。

这是一个问题,因为如果选择的数字是数组的末尾,它将返回未定义的。

下面是javascript代码:

var grid = ['item1', 'item2', 'item3', 'item4', 'item5', 'item6', 'item7', 'item8', 'item9'];
var choice = 9;

function myFunction(clicked_id){
  $('#' + clicked_id).html('X');
  grid.splice(grid.indexOf(clicked_id), 1);
  choice -= 1;
    setTimeout(computer, 1000);
  player.push(clicked_id);
  findElement(player);
  console.log(player);
  console.log(grid);
  console.log(grid.length)

}

function computer(){
  var ran = Math.floor(Math.random() * choice);
  var res = grid[ran - 1];
    $('#' + res).html('O');
    grid.splice(grid.indexOf(res), 1);
  cpu.push(grid[ran]);
  findElement(cpu);
  choice -= 1;
  console.log(ran);
  console.log(cpu);
} 

下面是将记录在控制台日志中的内容:[“item1”]->我单击的内容

[“Item2”、“Item3”、“Item4”、“Item5”、“Item6”、“Item7”、“Item8”、“Item9”]->使用拼接后的新修改数组。

8->新数组长度

5-计算机抽取的随机数

[“Item8”]->计算机在数组中选取的元素(ARR[6])

“Item6”是井字游戏中选中的复选框。

这里有一个链接到我的codepen以查看运行中的代码。

https://codepen.io/nico3d911/pen/odvmpr?editors=0001

谢谢你的帮助!

共有2个答案

秦炜
2023-03-14

我的问题来自这样一个事实,即我在将数组元素推入新数组之前使用了splice。

下面是正确的javascript代码:

function computer(){
  var ran = Math.floor(Math.random() * choice);
  var res = grid[ran];
  $('#' + res).html('O');
  cpu.push(grid[ran]); // this line needs to be before having the element removed.
  grid.splice(grid.indexOf(res), 1);
  findElement(cpu);
  choice -= 1;
  console.log(ran);
  console.log(cpu);
}

控制台日志只是在这里帮助我修复错误。

谢谢你的帮助!

伏建修
2023-03-14

注意,JS使用的是从零开始的索引--因此item1有索引0,item2有索引1,等等,直到item9有索引8。

math.random()返回一个介于0和1之间(含0和1)的数字,这意味着math.random()*9可以返回超出界限的9-对于长度为9的数组,最大索引是8。

更改上限应该可以解决您的问题:

var ran = Math.floor(Math.random() * (choice - 1))

一个小问题:grid.indexof(res)总是等于ran,您可以只使用grid.splice(ran,1);

 类似资料:
  • x的底限:小于或等于x的最大整数。 语法 (Syntax) Math.floor( x ) ; 参数 (Parameter) X - 代表一个数字 例子 (Example) console.log("---Math.floor()---") console.log("Math.floor(2.8) : "+Math.floor(2.8)) console.log("Math.fl

  • neo4j旧索引和自动索引与新标签基模式索引以及旧索引自动索引和新索引方法之间的差异部分回答了这个问题 我还不能评论他们,在这里写一个新的帖子。在我的数据库中,我有一个遗留索引“topic”和标签“topic”。 我知道: 模式匹配(n: Label)将扫描节点; b.模式START(n: Index)将搜索遗留索引 c.自动索引是一种遗留索引,应该给我与(b)相同的结果,但在我的情况下没有 d.

  • 问题内容: 考虑以下代码: 输出为73。我能知道为什么以及如何吗? 问题答案: 在Java中,a 在编码中占16位。 的unicode是二进制的。 当您将a 和an (32位)相加时,将通过插入其二进制表示的开头来转换为。因此被转换为(十进制为71)。 这就是为什么你得到。

  • 我的模型JRip分类器有一个小问题 输出似乎足够好,但我担心相对绝对误差和相对平方根误差会很高。当我尝试J48和NaiveBayes时,它也高出了98%。这在分类中不是很重要吗?我可以就这样离开吗?否则,我如何改进它?成本矩阵为: 0 1 2 0 是什么改善了二等舱TP费率的结果。提前感谢您的帮助

  • 我有一个使用MVC模式开发的应用程序,现在我想对它的多个模型进行索引,这意味着每个模型都有不同的数据结构。 > 是使用多个索引更好,每个模型使用一个索引,还是在每个模型的同一索引中使用一个类型?我认为,这两种方法都需要不同的搜索查询。我刚开始做这个。 如果数据集是小的还是大的,这两个概念在性能上是否存在差异? 如果有人能为我推荐一些好的样本数据,我会自己测试第二个问题。