Guffa | Foto | Programmering

Slumpa utan dubbletter

Ibland vill man slumpa fram flera tal, men man vill inte att några av dem ska vara lika. Man kan ju jämföra varje tal man slumpar med de tidigare man slumpat, men det finns en mycket smidigare metod.

Metoden bygger på att man beräknar sannolikheten för att varje tal är med bland de man slumpar fram, och sedan jämför den sannolikheten med ett slumptal.

Ifall man till exempel ska slumpa fram sju tal mellan ett och 35, så är ju sannolikheten 7/35 för att talet ett är med. Sannolikheten för att följande tal beror ju sedan på ifall ettan är med eller inte. Ifall ettan är med så är sannoliketen 6/34 för att tvåan är med, annars är sannolikheten 7/34.

Sannolikheten är ett tal mellan noll och ett, därför behöver vi ett slumptal att jämföra med, som också är mellan noll och ett. Nu faller det sig så lyckligt att funktionen Rnd() faktiskt gör ett slumptal som ligger precis mellan dessa värden.

Så här blir koden för att slumpa fram sju tal mellan ett och 35:

<%
Dim lngCount, lngPos, lngItems

lngCount = 7 ' antal att slumpa
lngPos = 1 ' talet vi börjar på
lngItems = 35 ' antal tal
' initiera slumptalsgeneratorn
Randomize
' vi loopar så länge det finns tal kvar att slumpa fram
Do While lngCount > 0
   ' jämför ett slumptal med oddsen för att talet ska vara med
   If Rnd() < lngCount / lngItems Then
      ' det skulle vara med, så visa talet
      Response.Write lngPos & "<br>"
      ' räkna ned hur många tal som är kvar
      lngCount = lngCount - 1
   End If
   ' räkna upp talet
   lngPos = lngPos + 1
   ' räkna ned hur många det finns att välja ifrån
   lngItems = lngItems - 1
Loop
%>

En bieffekt av den här metoden är att talen man slumpar fram automatiskt kommer i nummerordning, vilket kan vara väldigt bra i vissa fall.