2016-04-22 86 views
0
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的一部分已经的arent的网格。它被设置为一个(n x n)矩阵,其中有n^2个数字;我需要填充的空间由矩阵中的零表示。到目前为止,我有一些代码检查每个单独的单元格值,如果不是0,将保留单独的值,如果值为0,则用1和n^2之间的随机数替换它们。问题是,显然我得到了一些重复的值,这是不允许的,每个数字只能有一个。VBA:添加随机号码,在网格

我该如何编码,以便网格中不会出现重复的数字? 我试图把在一个检查功能,看看他们是否已经在网格中,但我不知道该怎么办呢

感谢

+1

我会先扫描矩阵并将值存储在数组或字典中,然后在用随机数填充空白之前检查新生成的数字是否在数组(或字典)中。 – CMArg

+0

好吧,所以我把矩阵放在一个数组中,但我仍然不确定如何编码它以检查新生成的数字是否在该数组中。 – HWhite

+0

嗨,欢迎来到StackOverflow。请直接在问题中包含您的代码,这样人们将能够更轻松地为您提供帮助。 –

回答

0

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

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

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

1

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

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

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

这里有一种方法,你可以实现它:

类: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 

使用集合实际上是更多的内存高效并且比使用字典更快,但是字典可以更容易地验证它正在执行它所支持的功能sed要做(因为你可以使用.Exists等)。

+0

我喜欢它。为什么不提供一个如何实现你的建议的想法? – findwindow

+0

我一直试图抵制在过去两个小时内这样做,但会很快提供一个例子。 –

+0

我的错。当我说想法时,我的意思是建筑。就像创建随机数字生成器并将每个结果存储到数组中,然后使用所述数组填充矩阵。不要实际编写代码XD – findwindow