【问题标题】:Determining All Possibilities for a Random String?确定随机字符串的所有可能性?
【发布时间】:2010-06-21 18:22:26
【问题描述】:

我希望有更好的数学能力的人能帮助我找出一个字符串的全部可能性,因为它的长度和字符集。

即[a-f0-9]{6}

这种随机字符模式有哪些可能性?

【问题讨论】:

  • 对我来说看起来像 3 个字节。
  • @mcandre 我不需要列表,但是如果您能够建议可以创建这样一个列表的简单代码,那就太好了。
  • 顺便说一句,帮助您进行任何谷歌搜索我认为这是一个离散数学主题,称为排列:google.com/…
  • @AaronLS:在我看来这不是一个排列问题。

标签: random variations variation


【解决方案1】:

它等于集合中的字符数的 6 次方。 在 Python (3.x) 解释器中:

>>> len("0123456789abcdef")
16
>>> 16**6
16777216
>>>

编辑 1: 为什么是 1670 万?那么,000000 ... 999999 = 10^6 = 1M,16/10 = 1.6 和

>>> 1.6**6
16.77721600000000 

* 编辑 2:* 要在 Python 中创建列表,请执行以下操作:print(['{0:06x}'.format(i) for i in range(16**6)]) 然而,这也太大了。这是一个更简单、更简短的示例:

>>> ['{0:06x}'.format(i) for i in range(100)]
['000000', '000001', '000002', '000003', '000004', '000005', '000006', '000007', '000008', '000009', '00000a', '00000b', '00000c', '00000d', '00000e', '00000f', '000010', '000011', '000012', '000013', '000014', '000015', '000016', '000017', '000018', '000019', '00001a', '00001b', '00001c', '00001d', '00001e', '00001f', '000020', '000021', '000022', '000023', '000024', '000025', '000026', '000027', '000028', '000029', '00002a', '00002b', '00002c', '00002d', '00002e', '00002f', '000030', '000031', '000032', '000033', '000034', '000035', '000036', '000037', '000038', '000039', '00003a', '00003b', '00003c', '00003d', '00003e', '00003f', '000040', '000041', '000042', '000043', '000044', '000045', '000046', '000047', '000048', '000049', '00004a', '00004b', '00004c', '00004d', '00004e', '00004f', '000050', '000051', '000052', '000053', '000054', '000055', '000056', '000057', '000058', '000059', '00005a', '00005b', '00005c', '00005d', '00005e', '00005f', '000060', '000061', '000062', '000063']
>>> 

编辑 3: 作为一个函数:

def generateAllHex(numDigits):
    assert(numDigits > 0)
    ceiling = 16**numDigits
    for i in range(ceiling):
        formatStr = '{0:0' + str(numDigits) + 'x}'
        print(formatStr.format(i))

在 numDigits = 6 处打印需要一段时间。 我建议将其转储到文件中,而不是像这样:

def generateAllHex(numDigits, fileName):
    assert(numDigits > 0)
    ceiling = 16**numDigits
    with open(fileName, 'w') as fout:
        for i in range(ceiling):
            formatStr = '{0:0' + str(numDigits) + 'x}'
            fout.write(formatStr.format(i))

【讨论】:

  • 所以 16^6?试过了,说实话,这个数字似乎有点高。 @Hamish Grubijan 这是我得到的数字,但似乎很高。
  • 嗯,6 位十进制数给您从 000000 到 999999(一百万)。十六进制的 6 位数字给你 ffffff = ~ 1670 万
  • @Andre 十六进制 FFFFFF 是 16777215,由于 0000000 也是一种可能性,因此 Hamish 的答案是正确的 16777216。
  • @Andre:只是为了透视,美国本地电话号码匹配 [0-9]{7} 并且 - 忽略保留序列 - 每个区号有 10^7 个。组合学发展迅速。
【解决方案2】:

如果您只是在寻找可能性的数量,答案是(charset.length)^(length)。如果您需要实际生成一个可能性列表,只需遍历每个字符,递归生成字符串的其余部分。

例如

void generate(char[] charset, int length)
{
  generate("",charset,length);
}

void generate(String prefix, char[] charset, int length)
{
  for(int i=0;i<charset.length;i++)
  {
    if(length==1)
      System.out.println(prefix + charset[i]);
    else
      generate(prefix+i,charset,length-1);
  }
}

【讨论】:

    【解决方案3】:

    可能性的数量是你的字母表的大小,你的字符串大小的幂(当然,在一般情况下)

    假设您的字符串大小为 4:_ _ _ _ 并且您的字母表 = { 0 , 1 }: 有 2 种可能性将 0 或 1 放在第一位,第二位等等。 所以这一切总结为:alphabet_size^String_size

    【讨论】:

    • 我想你已经把它弄反了——它是字母的大小乘以字符串大小的幂。
    【解决方案4】:

    第一个:000000 最后:ffffff

    这匹配十六进制数字。

    【讨论】:

      【解决方案5】:

      对于任何给定的可能值集合,排列数是可能性数的项目数次方。

      在这种情况下,这将是 16 的 6 次方,即 16777216 种可能性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-05-26
        • 1970-01-01
        • 2011-03-07
        • 2018-06-29
        • 1970-01-01
        • 2015-02-20
        • 1970-01-01
        相关资源
        最近更新 更多