需要生成 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
我需要生成 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