需要生成 9 个小于 100 的唯一整数,使得没有两个整数的总和等于另一个 one/two 个数字

Need to generate 9 unique integers less than 100 such that no two has sum equal to another one/two numbers

我需要生成 9 个小于 100 的唯一整数,使得不存在满足 x + y = z 的数字 x、y 和 z,也不存在满足 a + b = 的数字 a、b、c 和 d VB.

中的 c + d

这是我的 VB 代码,但它生成的数字集不满足后一个条件。

Public Class Form1

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim Numbers(9) As Integer
    Dim w As Integer
    Dim x As Integer
    Dim y As Integer
    Dim z As Integer
S:
    Randomize()
    Numbers(1) = CInt(Int((99 * Rnd()) + 1))
    w = 2
    Do While w < 10
        Numbers(w) = CInt(Int((99 * Rnd()) + 1))
        x = 1
        Do While x < w
            If Numbers(w) = Numbers(x) Then
                GoTo S
            End If
            x = x + 1
        Loop
        w = w + 1
    Loop
    w = 1
    x = 1
    y = 1
    Do While w < 10
        x = 1
        y = 1
        Do While x < 10
            y = 1
            Do While y < 10
                If Numbers(y) = Numbers(x) + Numbers(z) Then
                    GoTo S
                End If
                y = y + 1
            Loop
            x = x + 1
        Loop
        w = w + 1
    Loop
    w = 1
    x = 1
    y = 1
    z = 1
    Do While w < 10
        x = 1
        y = 1
        z = 1
        Do While x < 10
            y = 1
            z = 1
            Do While y < 10
                z = 1
                Do While z < 10
                    If w <> x And w <> y And w <> z And x <> y And x <> z And y <> z And Numbers(x) + Numbers(y) = Numbers(z) + Numbers(w) Then
                        GoTo S
                    End If
                    z = z + 1
                Loop
                y = y + 1
            Loop
            x = x + 1
        Loop
        w = w + 1
    Loop
    MsgBox(Numbers(1) & " " & Numbers(2) & " " & Numbers(3) & " " & Numbers(4) & " " & Numbers(5) & " " & Numbers(6) & " " & Numbers(7) & " " & Numbers(8) & " " & Numbers(9))
End Sub
End Class

我做错了什么?

我用一个方法试了一下,生成你的随机数。

Vb.NET中的方法:

Public Function GenerateRandomNumbers(min As Integer, max As Integer, count As Integer, exceptNumbers As Integer()) As List(Of Integer)
    If count > max - min Then
        Throw New ArgumentOutOfRangeException("your count is more than min and max range!")
    End If

    Dim lst = New List(Of Integer)()
    Dim rand = New Random()

    While count >= 0
        Dim value = rand.[Next](min, max)

        Dim upValue As Boolean = False
        While lst.Any(Function(x) x = value) OrElse exceptNumbers.Any(Function(x) x = value)
            If value < min Then
                value += 1
                upValue = True
            ElseIf value > max Then
                Exit While
            ElseIf upValue Then
                value += 1
            Else
                value -= 1
            End If
        End While

        lst.Add(value)
        count -= 1
    End While

    Return lst
End Function

现在,您可以使用这个模型:

Dim lst = GenerateRandomNumbers(0, 100, 9, New Integer() {1, 5, 8, 6, 10, 2})

这是我的建议。
我认为您会发现它更具可读性:

Private Function CreateArray() As Integer()
    Dim Target As Integer()
    '' Create a list of all integers from 1 to 100, randomly sorted.
    Dim Source As List(Of Integer) = Enumerable.Range(1, 100).OrderBy(Function(orderby) Guid.NewGuid()).ToList()

    Target = New Integer(8) {}
    Dim i As Integer = 0
    For Each CurrentNumber As Integer In Source

        If ValidateNumber(CurrentNumber, Target) Then
            Target(i) = CurrentNumber
            i += 1
        End If
        If i = 9 Then
            Exit For
        End If
    Next
    Return Target

End Function

Private Function ValidateNumber(Number As Integer, Target As Integer()) As Boolean
    if Target.Length > 1 then '' otherwise there is no need to test at all
        For i As Integer = 0 To Target.Length - 3
            For j As Integer = i + 1 To Target.Length - 2
                '' First condition: the sum of any two numbers must be different than any other number
                If Target(i) + Target(j) = Number OrElse Target(i) + Number = Target(j) OrElse Target(j) + Number = Target(i) Then
                    Return False
                End If

                For k As Integer = j + 1 To Target.Length - 1
                    '' Second condition: the sum of any two numbers must be different than the sum of any other two numbers
                    If Target(i) + Target(j) = Target(k) + Number OrElse Target(i) + Target(k) = Target(k) + Number OrElse Target(i) + Number = Target(j) + Target(k) Then
                        Return False
                    End If
                Next
            Next
        Next
    end if
    Return True
End Function

您可以在 this fiddle.

中查看示例

更新
我想我在第二种情况下找到了问题:在它的第二部分我写了Target(i) + Target(k) = Target(k) + Number,但它应该是Target(i) + Target(k) = Target(j) + Number

我在编辑我的 ValidateNumber 时发现了问题,通过为数字添加有意义的命名变量来提高可读性。
这是您应该始终使用有意义的命名变量的另一个原因。

Private Function ValidateNumber(Number As Integer, Target As Integer()) As Boolean
    Dim First, Second, Third As Integer
    If Target.Length > 1 Then '' otherwise there is no need to test at all
        For i As Integer = 0 To Target.Length - 3
            First = Target(i)
            For j As Integer = i + 1 To Target.Length - 2
                Second = Target(j)
                '' First condition: the sum of any two numbers must be different than any other number
                If First + Second = Number OrElse First + Number = Second OrElse Second + Number = First Then
                    Return False
                End If

                For k As Integer = j + 1 To Target.Length - 1
                    Third = Target(k)
                    '' Second condition: the sum of any two numbers must be different than the sum of any other two numbers
                    If First + Second = Third + Number OrElse First + Third = Second + Number OrElse First + Number = Second + Third Then
                        Return False
                    End If
                Next
            Next
        Next
    End If
    Return True
End Function

我也更新了fiddle,大家可以自己测试一下。

不要为此使用随机数,除非你觉得幸运。只需迭代所有可能的组合并等待。

Sub Main()

    Dim n(9) As Integer ' Contains the list of 9 numbers
    Dim sums As New List(Of Integer) ' List of the sums of all the numbers

    n(0) = 1

    For x As Integer = 1 To 8
        n(x) = n(x - 1) + 1
    Next

    Do
        Dim x As Integer = 8

        ' Get the next number from the list
        Do
            n(x) += 1

            If n(x) >= 100 Then
                If x = 0 Then
                    Exit Do
                End If

                n(x) = n(x - 1) + 1
                x -= 1
            Else
                Exit Do
            End If
        Loop

        ' Get the list of all the sums
        sums.Clear()

        For a As Integer = 0 To 7
            For b As Integer = a + 1 To 8
                sums.Add(n(a) + n(b))
            Next
        Next

        Dim wrong As Boolean = False

        ' Is a sum equal to a number in the list?
        For Each s As Integer In sums
            For x = 0 To 8
                If s = n(x) Then
                    wrong = True
                End If
            Next
        Next

        ' Are two sums equal to each other?
        For a As Integer = 0 To sums.Count - 2
            For b As Integer = a + 1 To sums.Count - 1
                If sums(a) = sums(b) Then
                    wrong = True
                End If
            Next
        Next

        ' Everything passed!
        If Not wrong Then
            Exit Do
        End If
    Loop

    For Each x As Integer In n
        Console.WriteLine(x)
    Next

    Console.WriteLine("Done")
    Console.ReadLine()

End Sub