Just thought I'd throw out that this algorithm is actually awful
because the chance of advancing your solution set gets lower as time goes on. I know its like beating a dead horse. But I want to show
Since it prints attempts but from what I see doesnt store then the chance of increasing your solution set is equal to:
P = 1-((T-1)/94^8)
where P is between 0 and 1 and T is a number that represents how many unique guesses youve generated so far
As the passwords you have tried increases the chances you repeat a password does as well, it starts out at 1, a sure thing, but halfway in, you're generating 2 for every new password you get, 90% done, you're creating 10 to get one new one, and for the last one you can be expected to create 94^8 passwords, yes JUST to get the last possible attempt youre program would run through the same amount as a bruteforce would to get the answer for sure.
In fact, to generate the full wordlist at least once, your program would run about
sum(T=1->94^8) 1/P
Which wolfram alpha kindly informed me had zero chance of ever getting completed, at least for me. So I used 10000,100000, and 1000000 possibilities just for an efficiency calculation. It would run roughly 48000 times, 722000 times and 25 MILLION times respectively. I would assume that efficiency would degrade in a similar fashion all the way through, so I'd say its very fair to assume random guesses would take 500 times as long as straight bruteforcing for an 8 char string.
And thats if you know the string size.
No hate, good programming exercise, just making sure nobody who ever reads this thinks its a good idea