2016-04-22 74 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