VBA:将随机数添加到网格中的网格中

Sub FWP() Dim i As Integer Dim j As Integer Dim n As Integer n = Range("A1").Value For i = 1 To n For j = 1 To n If Cells(i + 1, j) = 0 Then Cells(i + 1, j).Value = Int(((n ^ 2) - 1 + 1) * Rnd + 1) ElseIf Cells(i + 1, j) <> 0 Then Cells(i + 1, j).Value = Cells(i + 1, j).Value End If Next j Next i 

我试图做一个功课问题的一部分,要求填补在VBA魔术广场缺失的空间。 它被设置为一个(nxn) 2数字的(nxn)matrix; 我需要填充的空间由matrix中的零表示。 到目前为止,我有一些代码,通过检查每个单元格值,并将保留值,如果不是0,如果值为0,它将它们replace1和n ^ 2之间的随机数。 问题是,显然我得到了一些重复的值,这是不允许的,每个数字只能有一个。

如何编码,以便网格中不会出现重复的数字? 我试图把一个检查function,看看他们是否已经在电网,但不知道如何做到这一点

谢谢

有很多方法可以使用,但是@CMArg正确地说,数组或字典是确保没有重复的好方法。

你想要避免的是每个单元格需要逐步填充的情况。 对于一个非常小的正方形(例如10×10)来说这不是问题,但是非常大的正方形可能会变得难看。 (如果你的范围是1-100,除31之外的所有数字已经在表格中了,这将需要很长时间 – 平均100次猜测 – 拉出一个未使用的数字,如果范围是1 -40000(200×200),则需要40000次猜测才能填满最后一个单元格。)

因此,不要保留已经使用的数字列表,而应考虑如何有效地通过和“截断”已经使用的数字,以便每个新的单元格只需要1个“猜测”来填充。

以下是您可以实现的一种方法:

Class:SingleRandoms

 Option Explicit Private mUnusedValues As Scripting.Dictionary Private mUsedValues As Scripting.Dictionary Private Sub Class_Initialize() Set mUnusedValues = New Scripting.Dictionary Set mUsedValues = New Scripting.Dictionary End Sub Public Sub GenerateRange(minimumNumber As Long, maximumNumber As Long) Dim i As Long With mUnusedValues .RemoveAll For i = minimumNumber To maximumNumber .Add i, i Next End With End Sub Public Function GetRandom() As Long Dim i As Long, keyID As Long Randomize timer With mUnusedValues i = .Count keyID = Int(Rnd * i) GetRandom = .Keys(keyID) .Remove GetRandom End With mUsedValues.Add GetRandom, GetRandom End Function Public Property Get AvailableValues() As Scripting.Dictionary Set AvailableValues = mUnusedValues End Property Public Property Get UsedValues() As Scripting.Dictionary Set UsedValues = mUsedValues End Property 

课堂实例:

 Public Sub getRandoms() Dim r As SingleRandoms Set r = New SingleRandoms With r .GenerateRange 1, 100 Do Until .AvailableValues.Count = 0 Debug.Print .GetRandom() Loop End With End Sub 

使用集合实际上比使用字典有更高的内存效率和更快的速度,但字典可以更容易地validation它正在做它应该做的事情(因为您可以使用.Exists等)。

没有人会为你做你的功课。 你只会欺骗自己。 如果他们对他们感到羞耻。

我不确定你的老师有多挑剔,但有很多方法可以解决这个问题。

您可以将matrix的值放入数组中。 检查是否存在零值元素,如果不存在,则中断。 然后获取您的潜在随机数插入。 使用for循环遍历数组遍历这个值。 如果不存在,则replace零元素。