我正在研究运动问题,并坚持使用基于茉莉花节点的测试之一,该测试表明我应该能够生成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);
});
我认为我需要做的是:
到目前为止,这是我的代码......
"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)我对如何检查重复项有错误的想法吗?
任何指示赞赏,谢谢。
答案 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就是一个很好的例子。
集合的一个属性是它没有重复。因此,当您向集合添加值时,它将查找重复项,然后在不存在重复项时添加该值。