2

だから私はVB6プロジェクトのアクティベーションクラスを作成していて、頭のオナラに遭遇しました。この特定の製品のシリアル番号を次の方法で生成する方法を設計しました。

XXXX-XXXX-XXXX-XXXX

数字の各グループは、数字のグループでコードを理解できる一致するドキュメントを知っている場合に読み取ることができるデータを表しています。したがって、たとえば、最初のグループは、製品が顧客に販売された月を表す場合があります。しかし、1月のすべてのシリアル番号を同じ4桁で始めることはできないため、この値を計算するために実行する必要のある内部計算がいくつかあります。私が着陸したのはこれです:

ABCD =シリアル番号の最初のグループの数字 (A + B)-(C + D)=#

これで、#は、製品が販売された月を表す16進値のテーブルに関連付けられます。何かのようなもの...

1月1日

2月2日

3月3日

...。

B-11月

C-12月

私の質問はここにあります-合計をB(11)に等しくする必要があることがわかっている場合、(A + B)-(C + D)= B(11)を生成するためにどのように正確に逆方向にコーディングできますか?それは非常に単純な方程式です、私は知っています-しかし、私がちょうど遭遇したばかりで、正しい方向に始めることができないようです。私はコードの完全な仕上げを求めているのではなく、プッシュするだけです。あなたが利用可能な完全な解決策を持っていて、共有したいのであれば、私は常にもう少し学ぶことにオープンです。

私はVB6でコーディングしていますが、VB.NET、C#、C ++ソリューションは、比較的簡単に移植できるため、同様に機能する可能性があります。コミュニティの助けは常に大歓迎です!

4

3 に答える 3

2

単一の解決策はありません(4つの変数を持つ1つの方程式があります)。いくつかの乱数を選択する必要があります。これが機能するものです(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

16進数を許可すると仮定します。0から9が必要な場合は、15を9に、30を18に置き換えます。

于 2009-12-22T17:40:42.293 に答える
0

OK-ペンと紙が常に解決策です...だからここに行きます...

(A + B)-(C + D)がXと呼ばれる特定の数値に等しくなるための値を見つけようとしています。最初に、0-Fまたは0-15に制限されるようにHEX値が必要であることを知っています。そこから、より良い出発点が必要なので、(A + B)の合計を表す乱数を生成します。これをYと呼びますが、値Xより小さくはなりません。次に、その数からY値を引きます。 Xの値を使用して、(C + D)を表す値を決定します。これをZと呼びます。同様のロジックを使用して、YとZをそれぞれ(A + B)= Yと(C + D)を表すことができる2つの数値に分解します。 )=Z。すべてのことを言い終えたら、4つの数値を作成するための適切なランダム化を行う必要があります。これを方程式に接続すると、適切な結果が返されます。

ただ脳のおならを乗り越えなければなりませんでした。

于 2009-12-22T17:42:40.710 に答える
0

これは少しハックに見えるかもしれません、そしてそれはあなたが行こうとしているところにあなたを連れて行かないかもしれません。ただし、キー文字列に対してより広い範囲の値を生成する必要があります。

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
于 2009-12-22T18:44:13.460 に答える