Jag försöker skapa en dictionary variabel med slumpade tal. Detta kanske är till hjälp: Jag löser det genom att lägga upp en Array med Maxantal. Problemet med en sådan lösning är mindre lediga nummer du har desto fler träffar kommer du ha mot din array. Till slut när du bara har en ledig plats kvar av t.ex. 10 000. Kommer sanolikheten att den slumpar ut en icke träffad 1/10 000.vill inte ha dubbletter av slumpade nummer...
Enda delenjag inte får att funka just nu är kontrollen av att det inte
finns dubletter. Jag är tacksam för tips.
Här är skriptet:
<%
Dim randomnumber
Dim DIClista
Set DIClista = CreateObject("Scripting.Dictionary")
Randomize
AntalImages = 20
MaxAntal = 20
for i=1 to AntalImages 'räkna så att vi får alla nummer i MaxAntal
'ta fram ett slump nummer
randomnumber = Int( Rnd * Maxantal ) + 1
'Här är kontrollen som inte funkar...
For j=0 to DIClista.Count
If DIClista(j) = randomnumber then
exit for
i = i - 1
Else
DIClista(i) = randomnumber
End If
Next
'testutskrift
response.write i & ", "
response.write DIClista(i) %> <br> <%
Next
%>Sv: vill inte ha dubbletter av slumpade nummer...
Const Maxantal = 20
Const AntalImages = 20
Dim i
Dim randomnumber
Dim DIClista
Set DIClista = CreateObject("Scripting.Dictionary")
Randomize
'räkna så att vi får alla nummer i MaxAntal
For i = 1 To AntalImages
'ta fram ett slump nummer
Do
randomnumber = Int(Rnd * Maxantal) + 1
Loop While DIClista.Exists(randomnumber)
DIClista.Add randomnumber, randomnumber
Next
'testutskrift
For Each randomnumber In DIClista
Response.Write randomnumber & ", <BR/>"
Next
Din strategi för att slumpa tal garanterar inte terminering.
Om du har en mängd bilder, du vill ha en slumpvist vald delmängd av dessa bilder. Då bör du istället skriva:
Const Maxantal = 20
Const AntalImages = 100
Dim i, key
Dim randomnumber
Dim Result As Scripting.Dictionary
Dim DIClista As Scripting.Dictionary
Set Result = CreateObject("Scripting.Dictionary")
Set DIClista = CreateObject("Scripting.Dictionary")
Randomize
'Hämtar bilderna,
'detta skall ersätt med databasanrop eller
'listning av katalog
For i = 1 To AntalImages
DIClista.Add i, "C:\images\image" & i & ".jpg"
Next
'Hämtar slumpist valda bilder
i = 0
Do While i < Maxantal And DIClista.Count > 0
'ta fram en nyckel för slumpvis vald bild
randomnumber = Int(Rnd * DIClista.Count)
key = DIClista.Keys(randomnumber)
'Lägger till det i resultatet
Result.Add key, DIClista.Items(randomnumber)
'Inga dubbleter tillåtna,
'Så vi tar bort det från urvalet
DIClista.Remove key
Loop
'testutskrift
For Each key In Result
Debug.Print key, Result.Item(key)
Next
Sv: vill inte ha dubbletter av slumpade nummer...
Jag sätter ett kryss i det fack som slumpades fram första gången.
Jag kollar arrayen varje gång och hoppar över om det står ett kryss
i det facket som slumpen drog, loopar vidare tills Maxantal uppnåtts.Sv:vill inte ha dubbletter av slumpade nummer...
Med andra ord den är mycket snabb i början. Men tar längre och längre tid. Teoretiskt kan väl slumpen te sig så att den sista aldrig träffas?
En annan strategi är att byta plats på två element i arrayen ett givet antal gånger. För att garanter att alla element bytt plats:Function RandomData(Size)
Dim I
Dim Pos
Dim Temp
ReDim Data(1 To Size)
'Fill Array with Data
For I = 1 To Size
Data(I) = I
Next
'Randomize order of the data
For I = 2 To Size
'Random number
Pos = 1 + Int(Rnd * I)
'Swaps the elements
Temp = Data(I)
Data(I) = Data(Pos)
Data(Pos) = Temp
Next
'Returns Data
RandomData = Data
End Function
Koden avser bara visa algoritmens struktur. Den är därför skriven i VB-Script där bara datatypen variant finns.
Denna koden garanterar terminering. Jag tror den dessutom är den är en av den effektivaste, då det gäller utnytjande av plats. Jag har svårt att värdera hur slumpmässig den är.