代码之家  ›  专栏  ›  技术社区  ›  Jeff

生成序列号

  •  1
  • Jeff  · 技术社区  · 15 年前

    所以我正在为一个vb6项目创建一个激活类,我遇到了一个脑残。我已经设计了如何用以下方式生成这个特定产品的序列号。

    XXXX-XXXX-XXXX-XXXX年

    如果我知道匹配的文档可以让我用数字组理解代码,那么每组数字将代表我可以阅读的数据。因此,例如,第一组可能代表产品销售给客户的月份。但我不能让1月份的所有序列号都以相同的四位数开始,所以需要进行一些内部数学计算这个值。我的目的是:

    A B C D=序列号第一组中的数字 (A+B)-(C+D)=#

    现在将涉及一个十六进制值表,该表将表示产品销售的月份。有点像…

    1—一月

    2—二月

    3月3日

    B-十一月

    C-12月

    我的问题就在这里——如果我知道我需要总数等于b(11),那么我如何精确地向后编码来生成(a+b)-(c+d)=b(11)?我知道,这是一个非常简单的方程,但我刚刚遇到的一些事情似乎无法从正确的方向开始。我不是要求完整的代码工作,而是一个推动。如果你有一个完整的解决方案,并想分享,我总是乐于学习更多。

    我在VB6中编码,但是VB.NET,C,C,C++解决方案也可以工作,因为我可以比较容易地把它们移植过来。非常感谢社区的帮助!

    3 回复  |  直到 15 年前
        1
  •  2
  •   balpha    15 年前

    没有单一的解(你有一个有四个变量的方程)。你必须选择一些随机数。这是一个有效的方法(在python中,但是你明白了这一点):

    from random import randint
    
    X = 11 # the one you're looking for
    
    A_plus_B = randint(X, 30)
    A = randint(max(A_plus_B - 15, 0), min(A_plus_B, 15))
    B = A_plus_B - A
    
    C_plus_D = A_plus_B - X
    C = randint(max(C_plus_D - 15, 0), min(C_plus_D, 15))
    D = C_plus_D - C
    

    我假设您允许十六进制数字;如果您只需要0到9,那么用9替换15,用18替换30。

        2
  •  0
  •   Jeff    15 年前

    好的-纸笔永远是解决办法…所以这里…

    试图找出(a+b)-(c+d)应该等于某个称为x的数字的值。首先,我知道我需要十六进制值,以便将我限制为0-f或0-15。从那里我需要一个更好的起点,这样我就可以生成一个表示(a+b)总数的随机数,我们称之为y,但不小于x值。然后从x的y值中减去,以确定表示(c+d)的值,我们称之为z。使用类似的逻辑将y和z分解为两个数字,每个数字都是t可以表示(a+b)=y和(c+d)=z。做完所有这些之后,我应该有一个很好的随机化创建4个数字,当插入到我的方程中时,将返回一个合适的结果。

    只需通过大脑放屁。

        3
  •  0
  •   Bob77    15 年前

    这可能看起来有点老土,也可能不会带你去你想去的地方。但是,它应该为您的键字符串生成更广泛的值范围:

    Option Explicit
    
    Private Function MonthString(ByVal MonthNum As Integer) As String
        'MonthNum: January=1, ... December=12.  Altered to base 0
        'value for use internally.
        Dim lngdigits As Long
    
        MonthNum = MonthNum - 1
        lngdigits = (Rnd() * &H10000) - MonthNum
        MonthString = Right$("000" & Hex$(lngdigits + (MonthNum - lngdigits Mod 12)), 4)
    End Function
    
    Private Function MonthRecov(ByVal MonthString As String) As Integer
        'Value returned is base 1, i.e. 1=January.
        MonthRecov = CInt(CLng("&H" & MonthString) Mod 12) + 1
    End Function
    
    Private Sub Form_Load()
        Dim intMonth As Integer
        Dim strMonth As String
        Dim intMonthRecov As Integer
        Dim J As Integer
    
        Randomize
        For intMonth = 1 To 12
            For J = 1 To 2
                strMonth = MonthString(intMonth)
                intMonthRecov = MonthRecov(strMonth)
                Debug.Print intMonth, strMonth, intMonthRecov, Hex$(intMonthRecov)
            Next
        Next
    End Sub