【问题标题】:how to generate unique ID character using letters a-z如何使用字母 a-z 生成唯一 ID 字符
【发布时间】:2018-10-01 19:50:12
【问题描述】:

这是一个小挑战,希望对其他人也有用。

任务是从英文字母中获取一个ID字符。从头到尾

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

我知道如果我们在获得单个字符 ID 后选择随机字符(完成),这可以增加。(但是)我发现很难弄清楚如何管理不击中已经找到的组合(ID 必须是独特)。正如我们所看到的,如果它开始一遍又一遍地找到相同的组合需要很长时间。随着我们获得越来越多的 ID 组合,这种概率会增加。

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

fiddle

代码:

html

<p>
  start
</p>

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>');

【问题讨论】:

  • 随机数很可能是随机生成的,但在随机数出现某些情况后或在生成随机数的阶段内,它们可以相同地重复。这就是为什么这些被称为伪随机数。这些不是自然随机的。
  • 如果您生成 26 个字符,则两次获得相同字符的机会大约是 6e36 中的 1。
  • 不要删除您使用的字符。无需防止唯一 ID 中出现重复字符。

标签: javascript math random


【解决方案1】:

首先,不要用字母来考虑 ID,而是用 数字 来考虑它。

由于有 26 个可能的字符,因此每个字符都可以被视为以 26 为基数的数字系统中的一个数字,分别为 a == 0z == 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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-08
    • 1970-01-01
    • 2011-05-21
    • 1970-01-01
    • 2017-12-09
    相关资源
    最近更新 更多