Javascript 如何使用字母a-z生成唯一的ID字符

Javascript 如何使用字母a-z生成唯一的ID字符,javascript,math,random,Javascript,Math,Random,这里有一个小挑战,我希望它对其他人也有用 任务是从英语字母表中获取ID字符。从a到z 我的解决方案目前允许26个不同长度的ID(字)(最大可能)。有90个可能的词 我知道,如果我们在获得单字符ID后随机选取字符(完成),这可能会增加(但是)我发现很难找到如何管理不命中已找到的组合(ID必须是唯一的)。正如我们看到的,如果它开始一次又一次地寻找相同的组合,需要很长时间。当我们获得越来越多的ID组合时,这种概率增加 这是我要测试和检查的代码和小提琴: 代码: html 开始 jquery:

这里有一个小挑战,我希望它对其他人也有用

任务是从英语字母表中获取ID字符。从a到z

我的解决方案目前允许26个不同长度的ID(字)(最大可能)。有90个可能的词

我知道,如果我们在获得单字符ID后随机选取字符(完成),这可能会增加(但是)我发现很难找到如何管理不命中已找到的组合(ID必须是唯一的)。正如我们看到的,如果它开始一次又一次地寻找相同的组合,需要很长时间。当我们获得越来越多的ID组合时,这种概率增加

这是我要测试和检查的代码和小提琴:

代码:

html


开始

jquery:

 function addto(t) {
    $("p").append("<b>" + t + "</b>");
  }

global_ID_array = [];
lowerAlpha = "abcdefghijklmnopqrstuvwxyz";
var myIDlength = 1;
    function getIDChar (){
        do {
            var myIDchar = lowerAlpha.substr(0, myIDlength);
            lowerAlpha = lowerAlpha.replace(myIDchar,'');
            if (lowerAlpha.length < myIDlength){
                lowerAlpha = "abcdefghijklmnopqrstuvwxyz";      //reset
                myIDlength++;
      }
        } while (global_ID_array.indexOf(myIDchar) > -1)
        global_ID_array.push(myIDchar);
        addto(myIDlength+':'+global_ID_array.length+',');
    }

  do{
  getIDChar();
  }while (myIDlength < 26);
  addto('<br \>myIDlength='+myIDlength);
  addto('<br \>global_ID_array last val='+global_ID_array[global_ID_array.length-1]+'<p>');
函数addto(t){
$(“p”)。追加(“+t+”);
}
全局_ID_数组=[];
lowerAlpha=“abcdefghijklmnopqrstuvxyz”;
var myIDlength=1;
函数getIDChar(){
做{
var myIDchar=较低的分段(0,myIDlength);
lowerAlpha=lowerAlpha.replace(myIDchar.);
if(较低的PHA.length-1)
全局_ID_array.push(myIDchar);
addto(myIDlength+':'+全局ID_数组.length+',');
}
做{
getIDChar();
}而(myIDlength<26);
addto('myIDlength='+myIDlength);
addto('global_ID_array last val='+global_ID_array[global_ID_array.length-1]+'');

首先,不要用字母来思考ID,而要用数字来思考

由于有26个可能的字符,每个字符都可以被视为base-26数字系统的一个数字,
a==0
z==25
。现在的问题归结为生成一个数字,并使用字母作为数字将其转换为base-26。由于ID长度为26个字符,我们最多可以生成
26^26
唯一ID

现在,为了确保生成的ID是唯一的(最多为
26^26
生成的ID),我们需要找到一种每次生成唯一编号的方法。最简单的方法是在0处初始化计数器并使用它生成ID。每次生成ID时,递增计数器。当然,这是一个非常确定的生成算法,但是您可以使用种子随机数生成器来保证在某个范围内生成的随机数的唯一性

算法可能如下所示:

n = random(0, 26^26 - 1)

id = "a" * 26
// chars[i] is the character representing the base-26 digit i; 
// you may change/shuffle the list as you please
chars = ['a', 'b', 'c', ..., 'y', 'z']

for i in 0..26 {
    // Get the character corresponding to the next base-26 digit of n (n % 26)
    id[26 - i] = chars[n % 26]
    n /= 26
}

随机数最有可能生成为随机数,但在随机数发生一定次数后,或在生成随机数的阶段内,它们可以重复相同的次数。这就是为什么这些被称为伪随机数。这些不是自然随机的。如果生成26个字符,两次获得相同字符的几率约为6e36中的1。不要删除您使用的字符。无需防止唯一ID中出现重复字符。
n = random(0, 26^26 - 1)

id = "a" * 26
// chars[i] is the character representing the base-26 digit i; 
// you may change/shuffle the list as you please
chars = ['a', 'b', 'c', ..., 'y', 'z']

for i in 0..26 {
    // Get the character corresponding to the next base-26 digit of n (n % 26)
    id[26 - i] = chars[n % 26]
    n /= 26
}