[英]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);
});
我认为我需要做的是:
到目前为止,这是我的代码...
"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.