Search code examples
pythoncombinationspercentagecombinatoricspassword-generator

How to get percentage of combinations computed?


I have this password generator, which comute combination with length of 2 to 6 characters from a list containing small letters, capital letters and numbers (without 0) - together 61 characters.

All I need is to show percentage (with a step of 5) of the combinations already created. I tried to compute all the combinations of selected length, from that number a boundary value (the 5 % step values) and count each combination written in text file and when when the count of combinations meets the boundary value, print the xxx % completed, but this code doesn't seem to work.

Do you know how to easily show the percentage please?

Sorry for my english, I'm not a native speaker.

Thank you all!

def pw_gen(characters, length):

    """generate all characters combinations with selected length and export them to a text file"""

    # counting number of combinations according to a formula in documentation
    k = length
    n = len(characters) + k - 1
    comb_numb = math.factorial(n)/(math.factorial(n-length)*math.factorial(length))

    x = 0

    # first value
    percent = 5

    # step of percent done to display
    step = 5

    # 'step' % of combinations
    boundary_value = comb_numb/(100/step)

    try:
        # output text file
        with open("password_combinations.txt", "a+") as f:
            for p in itertools.product(characters, repeat=length):
                combination = ''.join(p)

                # write each combination and create a new line
                f.write(combination + '\n')
                x += 1

                if boundary_value <= x <= comb_numb:
                    print("{} % complete".format(percent))
                    percent += step
                    boundary_value += comb_numb/(100/step)

                elif x > comb_numb:
                    break

Solution

  • First of all - I think you are using incorrect formula for combinations because itertools.product creates variations with repetition, so the correct formula is n^k (n to power of k).

    Also, you overcomplicated percentage calculation a little bit. I just modified your code to work as expected.

    import math
    import itertools
    
    def pw_gen(characters, length):
        """generate all characters combinations with selected length and export them to a text file"""
    
        k = length
        n = len(characters)
        comb_numb = n ** k
    
        x = 0
        next_percent = 5
        percent_step = 5
    
        with open("password_combinations.txt", "a+") as f:
            for p in itertools.product(characters, repeat=length):
                combination = ''.join(p)
    
                # write each combination and create a new line
                f.write(combination + '\n')
                x += 1
    
                percent = 100.0 * x / comb_numb
                if percent >= next_percent:
                    print(f"{next_percent} % complete")
                    while next_percent < percent:
                        next_percent += percent_step
    

    The tricky part is a while loop that makes sure that everything will work fine for very small sets (where one combination is more than step percentage of results).