سؤال

كنت آمل أن يساعدني شخص لديه قدرات رياضيات أفضل في معرفة إجمالي الاحتمالات لسلسلة بالنظر إلى طولها وطولها.

أي [A-F0-9] {6}

ما هي إمكانيات هذا النمط من الأحرف العشوائية؟

هل كانت مفيدة؟

المحلول

إنه يساوي عدد الأحرف في المجموعة التي تم رفعها إلى 6th Power. في المترجم الفوري في بيثون (3.x):

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

تحرير 1:لماذا 16.7 مليون؟ حسنًا ، 000000 ... 999999 = 10^6 = 1M ، 16/10 = 1.6 و

>>> 1.6**6
16.77721600000000 

* تحرير 2:*لإنشاء قائمة في بيثون ، افعل: 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))

نصائح أخرى

إذا كنت تبحث فقط عن عدد الاحتمالات ، فإن الإجابة هي (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);
  }
}

عدد الاحتمالات هو حجم الأبجدية الخاصة بك ، إلى قوة حجم السلسلة الخاصة بك (في الحالة العامة ، بالطبع)

على افتراض أن حجم السلسلة الخاص بك هو 4: _ _ _ _ و alphabet الخاص بك = {0 ، 1}: هناك احتمالان لوضع 0 أو 1 في المركز الأول وما إلى ذلك. لذلك كل ما يلخص إلى: alphabet_size^string_size

أولاً: 000000 الأخير: FFFFFF

هذا يطابق أرقام سداسية عشرية.

بالنسبة لأي مجموعة من القيم المحتملة ، فإن عدد التباديل هو عدد الاحتمالات التي يتم جمعها إلى قوة عدد العناصر.

في هذه الحالة ، سيكون ذلك 16 إلى القوة السادسة ، أو 16777216 إمكانيات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top