【问题标题】:Generate 5 digit random code which is not in the list [duplicate]生成不在列表中的5位随机码[重复]
【发布时间】:2014-10-29 20:27:21
【问题描述】:

我的要求是生成 5 位唯一代码,该代码不在列表中。

例如,如果我有[12345, 54321, 13245, 11234],我想生成34522 等。我正在使用下面的代码

function id(){
    var text = "", can = "12345";
    for( var i = 5; i--; text += can.charAt(Math.floor(Math.random() * can.length)));
    return text;
}

var list = [12345, 54321, 13245, 11234];
var generated;
while(!generated){
   var t = makeid();
      if(list.indexOf(t) == -1){
          generated = t;
      }
}

这很好用,但是当列表增长时,这将花费更多时间(?)。有没有其他方法可以写这个机制。

【问题讨论】:

  • 如果只是数字,您可以使用哈希方法。 var seen={},然后是 if(!(x in seen)){seen[x]=1}。这样会更快。
  • @elclanrs 是的,这是真的。但是假设列表是一个数组,有很多我无法改变的操作。对不起
  • 您没有抓住重点,我的意思是使用对象作为缓存,而不是在数组上调用 indexOf。将缓存保存在闭包中。
  • @elclanrs 喜欢var obj = {}, for(var i = list.length; i--; obj[list[i]] = true) 然后if(t in obj)?

标签: javascript


【解决方案1】:

作为@elclanrs said,最好使用哈希方法

var obj = {};
for(var i=0; i<list.length; ++i) { obj[list[i]] = true; }

然后检查

obj.hasOwnProperty(t);

最好使用hasOwnProperty 而不是in 以避免在原型链中搜索。


但是,您可以使用 ES6 Set 来简化它:

var set = Set(list);

然后检查

set.has(t)

请注意,并非所有浏览器都支持它。


注意id 返回一个字符串,但list 是一个数字数组!

要解决此问题,请将 id 转换为数字(例如,使用一元 +),或使用类似的东西

function id() {
    var num = 0, len = 5;
    for(var i=0; i<len; ++i) {
        num *= 10;
        num += Math.floor(Math.random() * len) + 1;
    }
    return num;
}

【讨论】:

  • 感谢您的回答。我使用了相同的方法并制作了如下所示的哈希,而不是使用 for loop JSON.parse('{"' + (list.split(',').join('":0,"')) + '":0}');
猜你喜欢
  • 1970-01-01
  • 2016-02-24
  • 2018-12-21
  • 1970-01-01
  • 1970-01-01
  • 2013-11-22
  • 2016-10-28
  • 1970-01-01
相关资源
最近更新 更多