27. juni 2007 - 23:05Der er
15 kommentarer og 4 løsninger
VBA tilfældige tal
Jeg skal bruge en stump VBA-kode til følgende:
A1: Et tilfældigt heltal mellem 1 og 29 A2: Et tilfældigt heltal mellem 1 og 29 A3: Et tilfældigt heltal mellem 1 og 29
Forskellen på det midterste tal (værdimæssigt) og det største skal være mindst 5 og maks. 12. Ligeledes skal forskellen på det midterste tal og det mindste være mindst 5 og maks. 12.
Derudover må forskellen mellem det midterste tal og det største ikke være det samme som forskellen mellem det midterste og det mindste.
Endeligt skal ovenstående gentages på 60 kolonner.
Nogen som kan knække nøden? Løsningen må gerne laves, så man umiddelbart i koden kan ændre på variablerne: - Mindste forskelsværdi (default: 5) - Største forskelsværdi (default: 12) - Største tal (default: 29) - Mindste tal (default: 1) - Antal gentagelser (default: 60)
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
For i = 1 To repeats Do a(0) = Int(Rnd * intHeigh) + intLow a(1) = Int(Rnd * intHeigh) + intLow a(2) = Int(Rnd * intHeigh) + intLow SortArray (a) If a(1) - a(0) > diffLow And a(1) - a(0) < diffHeigh Then If a(2) - a(1) > diffLow And (2) - a(1) < diffHeigh Then Cells(1, i) = a(0) Cells(2, i) = a(1) Cells(3, i) = a(2) Exit Do End If End If Loop Next
Sub beregnTal() Dim tal, maks, mini, midi, antalOK For kol = 1 To 60 Randomize ' Initialize random-number generator. antalOK = 0 While antalOK < 3 For ræk = 1 To 3 tal = Int((29 * Rnd) + 1) ' Generate random value between 1 and 6. Cells(ræk, kol) = tal Next ræk
If antalOK < 3 Then antalOK = 0 End If Wend Next kol End Sub Private Sub sorter(adresse) Dim p, adr adr = Mid(adresse, 2) p = InStr(adr, "$") kolonne = Left(adr, p - 1)
Range(kolonne + "1:" + kolonne + "3").Select Selection.Sort Key1:=Range(kolonne + "1"), Order1:=xlAscending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ DataOption1:=xlSortNormal End Sub Private Function diff(tal1, tal2) If tal1 - tal2 >= 5 And tal1 - tal2 <= 12 Then diff = 1 Else diff = 0 End If End Function Private Function diff2(tal1, tal2, tal3) If tal1 - tal2 <> tal2 - tal3 Then diff2 = 1 Else diff2 = 0 End If End Function
If antalOK < 3 Then antalOK = 0 End If Wend Next kol End Sub Private Sub sorter(adresse) Dim p, adr adr = Mid(adresse, 2) p = InStr(adr, "$") kolonne = Left(adr, p - 1)
Range(kolonne + "1:" + kolonne + "3").Select Selection.Sort Key1:=Range(kolonne + "1"), Order1:=xlAscending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ DataOption1:=xlSortNormal End Sub Private Function diff(tal1, tal2) If tal1 - tal2 >= MinDiff And tal1 - tal2 <= MaxDiff Then diff = 1 Else diff = 0 End If End Function Private Function diff2(tal1, tal2, tal3) If tal1 - tal2 <> tal2 - tal3 Then diff2 = 1 Else diff2 = 0 End If End Function
Mikkelk, kan du lave det sådan, at de 3 tal står i tilfældig rækkefølge og ikke stigende? Derudover ser det ud til, at min regel om: "Derudover må forskellen mellem det midterste tal og det største ikke være det samme som forskellen mellem det midterste og det mindste." ikke er opfyldt. Kan du løse den?
Supertekst, jeg får ikke din kode til virke. Den står bare og sorterer i cellerne A1:A3.
Nå ja, det havde jeg da lige overset :-) Her kommer en rettet udgave: Function SortArray(varArray) For i = UBound(varArray) - 1 To 1 Step -1 MaxVal = varArray(i) MaxIndex = i
For j = 0 To i If varArray(j) > MaxVal Then MaxVal = varArray(j) MaxIndex = j End If Next
If MaxIndex < i Then varArray(MaxIndex) = varArray(i) varArray(i) = MaxVal End If Next End Function
mikkelk, det ser fint ud, kunne du også lade de 3 tal komme i tilfældig rækkefølge?
Tallene skal bruges, som en del af en anerkendt intelligenstest. Den går i al sin enkelthed ud på, at man skal finde det midterste tal og så regne ud, hvilket af de 2 øvrige, som ligger længst fra middeltallet. Til de 60 opgaver har man så 4 minutter.
Ok...sjovt :-) Her, rettet udgave(Erstatter tidligere helt, da jeg også fandt et par småfejl): Function SortArray(varArray) For i = UBound(varArray) - 1 To 1 Step -1 MaxVal = varArray(i) MaxIndex = i
For j = 0 To i If varArray(j) > MaxVal Then MaxVal = varArray(j) MaxIndex = j End If Next
If MaxIndex < i Then varArray(MaxIndex) = varArray(i) varArray(i) = MaxVal End If Next SortArray = varArray End Function
lowDiff = a(1) - a(0) heighDiff = a(2) - a(1) If lowDiff > diffLow And lowDiff < diffHeigh And heighDiff > diffLow And heighDiff < diffHeigh And lowDiff <> heighDiff Then Cells(1, i) = b(0) Cells(2, i) = b(1) Cells(3, i) = b(2) Exit Do End If Loop Next
Jeg har udvidet modellen lidt, så den er klar til test, og også indeholder kontrolfunktion. Det går lige med at klare 60 rigtige på 4 min., men man må ikke have mange "koncentrationssvigt" :-)
Det ser ud til, at der stadig er en fejl. Hvis diffLow sættes til 8 og diffHeigh sættes til 12 får jeg kun udfalds-differencerne 9,10 og 11. 8 og 12 burde vel også være inkluderet.
lowDiff = a(1) - a(0) heighDiff = a(2) - a(1) If lowDiff >= diffLow And lowDiff <= diffHeigh And heighDiff >= diffLow And heighDiff <= diffHeigh And lowDiff <> heighDiff Then Cells(1, i) = b(0) Cells(2, i) = b(1) Cells(3, i) = b(2) Exit Do End If Loop Next
Det gør det ikke når jeg kører den...det er vel differencerne mellem højste/midterste og laveste/midterste der skal ligge i intervallet - og det gør de altså...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.