繁体   English   中英

使用随机生成的值检查数组中的重复项

[英]Check for duplicates in array with randomly generated values

我正在研究运动问题,并停留在一个基于茉莉花节点的测试中,该测试表明我应该能够生成10000个随机名称而不会发生冲突(例如2个随机生成的名称匹配)。 这是测试:

it('there can be lots of robots with different names each', function() {

    var i,
    numRobots = 10000,
    usedNames = {};

    for (i = 0; i < numRobots; i++) {
      var newRobot = new Robot();
      usedNames[newRobot.name] = true;
    }

    expect(Object.keys(usedNames).length).toEqual(numRobots);

});

认为我需要做的是:

  1. 创建一个数组来保存所有名称(robotNames),
  2. 每次生成名称时,请检查名称是否存在于数组中,
  3. 如果是这样,请生成另一个名称,
  4. 如果不是,则将其添加到数组中。

到目前为止,这是我的代码...

"use strict";

var robotNames = [];
var name;

var Robot = function() {
    this.name = this.generateName();
};

Robot.prototype.generateName = function() {

    var letters = "";
    var alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

    var numbers = "";
    var digits = "0123456789";

    // generate random characters for robot name...

    for( var i=0; i < 2; i++ ) {
        letters += alphabet.charAt(Math.floor(Math.random() *    alphabet.length));
    };

    for( var i=0; i < 3; i++ ) {
        numbers += digits.charAt(Math.floor(Math.random() * digits.length));
    };

    name = letters+numbers;

    // Loop through array to check for duplicates

    for(var i = 0; i < robotNames.length; i++) {
        if (name == robotNames[i]) {
            this.generateName();
            return;
        } else {
            robotNames.push(name);
        }
    }

    return name;
};

Robot.prototype.reset = function() {
     this.name = this.generateName();
};

module.exports = Robot;

测试失败,并显示错误消息:“预期9924等于10000”。

每次运行测试时,“ 9924”数字都会略有不同。 我认为这意味着generateName函数最终会生成2个匹配的随机名称。 似乎我的检查重复项的循环未在运行,我不确定为什么。

我尝试了几个不同版本的循环,但没有成功。 所以我的问题是:a)我的方法正确吗,循环的语法有问题? 或b)我对在此处检查重复项是否有错误的想法?

任何指针表示赞赏,谢谢。

问题出在这一点:

for(var i = 0; i < robotNames.length; i++) {
    if (name == robotNames[i]) {
        this.generateName();
        return;
    } else {
        robotNames.push(name);
    }
}

...您可能只想在没有一个名称不匹配的情况下输入您的名字。 在这里,只要找到不匹配的一个,就将其添加到列表中。 您想要更多类似的东西:

for(var i = 0; i < robotNames.length; i++) {
    if (name == robotNames[i]) {
        return this.generateName();
    }
}
robotNames.push(name);

(实际上,结合您甚至没有将递归调用返回给this.generateName()的事实,我不确定您的程序如何工作...)

查找具有Sets实现的库。 Collections.js是一个很好的例子。

集合的一个属性是它没有重复项。 因此,当您向集合中添加值时,它将查找重复项,如果不存在重复项,则将其添加。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM