使用随机生成的值

时间:2016-02-03 22:11:31

标签: javascript arrays for-loop duplicates

我正在研究运动问题,并坚持使用基于茉莉花节点的测试之一,该测试表明我应该能够生成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. 如果没有,请将其添加到阵列中。
  5. 到目前为止,这是我的代码......

    "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)我对如何检查重复项有错误的想法吗?

    任何指示赞赏,谢谢。

2 个答案:

答案 0 :(得分:1)

问题在于:

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

...如果没有名字没有匹配,你可能只想推动你的名字。只要您找到不匹配的ONE,就会在此处将其添加到列表中。你想要更像的东西:

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

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

答案 1 :(得分:0)

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

集合的一个属性是它没有重复。因此,当您向集合添加值时,它将查找重复项,然后在不存在重复项时添加该值。