如何在循环中和python中的范围内生成随机非重复数字?

时间:2016-10-10 18:21:53

标签: python for-loop random while-loop range

  

嗨,我还是初学者,有点迷失。我正在为一所学校的项目工作,这个项目要求我编写不同的小程序,这些程序会猜测'给定的密​​码。这是一个强力计划,我需要它来猜测4个数字密码的每个可能组合,就像旧iPhone上的那些。我的问题是,当我使用random.sample时,它会多次生成相同的随机数。我可以使用什么功能,或者我应该更改什么,以便给定范围内的随机数不会重复?我尝试过rand.int,但它给了我" TypeError:' int'对象不可迭代"

     

其他问题:    - 一旦n == Password4,如何让我的循环停止?即使找到正确的密码,它也会继续。    - 有没有办法可以在成功之前计算失败次数(n!= Password4)(n == Password4)?

这是我的代码:

    import random

    Password4 = 1234
    def crack_password():

while True:
    for n in (random.sample(range(1112, 10000), 1)):
        while n == Password4:
            print(n, "is the password")
            break
        if n != Password4:
            print('fail')
            break

    crack_password()

更新:现在使用的代码不会生成随机的非重复数字,但可以用于我想要的目的。请仍然随时回答原始问题,非常感谢您的善意和及时的回复。

新守则(归功于@roganjosh):

    import datetime as dt

    Password4 = 9999

    def crack_password():
        start = dt.datetime.now()
        for n in range(10000):
            password_guess = '{0:04d}'.format(n)
            if password_guess == str(Password4):
                end = dt.datetime.now()
                print("Password found: {} in {}".format(password_guess, end - start))
                break
    guesses = crack_password()

3 个答案:

答案 0 :(得分:1)

如果您真的想以随机顺序尝试所有密码。

更容易实现这一目标
import random
digits = [str(i) for i in range(10)]
s = [''.join([a,b,c,d]) for a in digits for b in digits for c in digits for d in digits]
random.shuffle(s)
real_password = '1234'
i = 0
for code in s:
    if code == real_password:
        print()
        print('The password is: ', code)
        break
    else:
        i += 1
        print(i, ' failures', end='\r')

答案 1 :(得分:0)

您可能希望根据某些规则检查密码的所有可能值,例如" 4位"或" 8个小写字符"。将这些答案视为起点:

答案 2 :(得分:0)

您有两个while循环,因此即使您在找到密码时尝试break,外部(第一个)while循环也会重新启动它。< / p>

如果你想要独特的猜测,那么你必须考虑一下排列。但是,由于假设密码本身是随机的是合理的,因此对密码的随机猜测在破解密码方面不会比仅按顺序浏览整个潜在密码列表更有效。

尝试这样的事情:

import datetime as dt

Password4 = 5437

def crack_password():
    start = dt.datetime.now()
    for n in range(9999):
        password_guess = '{0:04d}'.format(n)
        if password_guess == str(Password4):
            end = dt.datetime.now()
            print "Password found: {} in {}".format(password_guess, end - start)
            break
guesses = crack_password()