4

通过使用 python 语言,什么是生成促销代码的聪明/有效的方法。喜欢用于生成折扣券的特殊号码。喜欢:1027828-1

谢谢

4

5 回答 5

8

以下不是特别pythonic或特别有效,但它可能就足够了:

 import random
 def get_promo_code(num_chars):
     code_chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
     code = ''
     for i in range(0, num_chars):
         slice_start = random.randint(0, len(code_chars) - 1)
         code += code_chars[slice_start: slice_start + 1]
     return code
于 2010-01-21T20:34:55.857 回答
5

1027828-1 非常小。攻击者只需几行代码甚至几天就可以做出约百万次的猜测。

这是使用 python 生成难以预测的数字的好方法,它适用于 linux 和 windows。为了二进制安全,它是 base64 的,这取决于你用它做什么,你可能想要 urllib.urlencode() 但我会避免使用 base10,因为它不存储尽可能多的信息。

import os
import base64

def secure_rand(len=8):
    token=os.urandom(len)
    return base64.b64encode(token)

print(secure_rand())

作为旁注,这是生成一个完整的字节,即 base256。256^8 是 18446744073709551616 应该足够大。

正如有人指出的那样,base64 对人类来说并不是一个很好的标记。考虑一种替代编码,如 url-safe base64 或可能是humanhash,因为它们更容易输入。

于 2010-01-21T20:16:16.867 回答
1

如果你需要一个 6 位的 # 你可以这样做,直到你找到一个唯一的值:

import random
print str(random.randint(100000, 999999))

或者依次去...

于 2010-01-21T20:15:37.740 回答
1

试试这个:

import random

coupon = open("coupons.txt", "a")

def generate(amount):

    for x in range(0, amount):

        a = random.randint(1000, 9999)
        a = str(a)
        b = random.randint(1000, 9999)
        b = str(b)
        c = random.randint(1000, 9999)
        c = str(c)

        total = ""
        total = str(total)
        total = a + " " + b + " " + c

        coupon.write(total)
        coupon.write("\n")


amount = int(input("How many coupons do you want to generate: "))

generate(amount)

coupon.close()

print("\nCode's have been generated!")

您可以根据需要制作优惠券。它们也保存到一个名为 coupons.txt 的 txt 文件中。

于 2020-05-06T18:11:18.743 回答
0

我对此提出了一个我认为相当聪明的答案,但依赖于一些可能不适用于您的情况的假设。

  • 结果代码是纯数字的。
  • 生成的代码在技术上是可变长度的;[10, 20]。

如果这些对你有用,那么这个解决方案也可以:

def code(seed = None):
    if (not seed) or (type(seed) != str) or (len(seed) < 10):
        seed = str(uuid.uuid4())[:10]

    code = ""
    for character in seed:
        value = str(ord(character))
        code += value

    return code[:20]

在此函数中,字符串类型的种子用作代码的基础。对于字符串中的每个字符,将其转换为其 ASCII 表示形式,然后将其附加到代码中。

默认情况下,该函数产生如下代码:'97534957569756524557',并且可以使用任意种子调用。例如...

code("pcperini's answer") == '11299112101114105110'
code(str(time.time())) == '49524956514950505257'
于 2014-12-11T15:39:37.073 回答