webForumDet fria alternativet

Slumpa med fso

ASP

25 svar · 841 visningar · startad av Asa

Medlem sedan dec. 20011 860 inlägg
Frågan#1

Vill slumpa fram en bild som finns i en speciell mapp varje gång sidan laddas. Nån som vet?!?

Medlem sedan aug. 20003 575 inlägg
#2

Antingen så döper du dom till nummer och slumpar mellan numren.

Eller så listar du dom på serven och efter ett visst slumpat tal av filer som listats på serven så vísar du den

Medlem sedan dec. 20011 860 inlägg
#3

Hmm, okej! Ska se om jag lyckas. Är inte så bra på slumpning!

Medlem sedan apr. 20003 174 inlägg
#4

..eller så läser du in dem i en array och slumpar från arrayen.

Medlem sedan dec. 20011 860 inlägg
#5

Åhh, ännu värre. Jag har inte lärt mig om arrayer ännu. Haha! Nåt ställe där man kan läsa om detta?

Medlem sedan apr. 20003 174 inlägg
#6

Skapa array:

[red]For Each Image In objFolder 'Loopa bilderna från mappen
	strImage = strImage & Image.Name &";"
Next[/red]

Skapa arrayen genom att splitta strImage vid ;
ex arrImage = Split(strImage, ";")

Slumpa sedan ett tal mellan LBound(arrImage) och UBound(arrImage) så är det klart.. =)

[r] Missade ju att lägga ut allt.. :r

 

Medlem sedan dec. 20011 860 inlägg
#7

Men jag har denna kod nu! Ska jag ha nåt kvar av denna kod?

<%Set FSO  = Server.CreateObject("Scripting.FileSystemObject")
Set Mapp = FSO.GetFolder(Server.MapPath("stuff"))

If Mapp.Files.Count = 0 Then%>
  TOMT
<%Else
  x=0
  For Each File In Mapp.Files
    If X = 1 Then 
      Exit For
    End If%>
      <a href="main.asp?cat=pics"><img src="stuff/<%=File.Name%>" border="1" width="100" height="75"></a>
    <%x=x+1
  Next
End If%>
Medlem sedan apr. 20003 174 inlägg
#8

Här är då en komplett variant:

[red]<%

Set FSO  = Server.CreateObject("Scripting.FileSystemObject")
Set Mapp = FSO.GetFolder(Server.MapPath("stuff"))

	If Mapp.Files.Count = 0 Then
		Response.Write "Tomt!"
	Else
		For Each File In Mapp.Files
			strImage = strImage & File.Name &";"
		Next
		arrImages = Split(strImage, ";")
	End If

Set FSO = Nothing

If IsArray(arrImages) Then

	randomize
	rndNumber = Int(Rnd * UBound(arrImages))
	Response.Write "<a href=""main.asp?cat=pics""><img src=""stuff/"& arrImages(rndNumber) &""" border=""1"" width=""100"" height=""75""></a>"

End If

%>[/red]
Medlem sedan dec. 20011 860 inlägg
#9

Supersnällt av dig Palle! Måste nog sätta mig ner och kolla igenom detta å lära mig! :)

Medlem sedan apr. 20003 174 inlägg
#10

np :)

Medlem sedan mars 20002 836 inlägg
#11

Vad händer när rnd blir 1???

Sista indexet i denna array är ju tom

Borde det inte vara:

<%

Set FSO  = Server.CreateObject("Scripting.FileSystemObject")
Set Mapp = FSO.GetFolder(Server.MapPath("stuff"))

	If Mapp.Files.Count = 0 Then
		Response.Write "Tomt!"
	Else
		For Each File In Mapp.Files
			strImage = strImage & File.Name &";"
		Next

		[b]strImage = Left(strImage, Len(strImage) - 1)[/b]

		arrImages = Split(strImage, ";")
	End If

Set FSO = Nothing

If IsArray(arrImages) Then

	randomize
	rndNumber = Int(Rnd * UBound(arrImages))
	Response.Write "<a href=""main.asp?cat=pics""><img src=""stuff/"& arrImages(rndNumber) &""" border=""1"" width=""100"" height=""75""></a>"

End If

%>

cya,
PatrikB

Medlem sedan dec. 20011 860 inlägg
#12

Jag har inte fått några problem med koden som Palle skrev. Å lägger jag in din kod får jag felmess!

Feltyp:
Körningsfel i Microsoft VBScript (0x800A0005)
Ogiltigt proceduranrop eller argument.: 'Left'
Medlem sedan mars 20002 836 inlägg
#13

Du har du skrivit av fel .... jag vet att det funkar

cya,
PatrikB

Medlem sedan mars 20002 836 inlägg
#14

ett sätt att testa slumpningen från arrayer är att sätta rnd = 1 då det är det största värde rnd kan få. Om du byter ut rnd mot 1 i palles kod så ser du att det kommer att bli tomt.

Du måste "filtrera" bort det sista ; -tecknet INNAN du splittar till array.

cya,
PatrikB

Medlem sedan apr. 20003 174 inlägg
#15

PatrikB skrev:

Du måste "filtrera" bort det sista ; -tecknet INNAN du splittar till array.

Hmm.. Är du säker på det? ;)

Testa följande ska du se:

[red]<%

str = "bild1;bild2;bild3;bild4;bild5;"
arr = Split(str, ";")

For i = 0 To 100000

	randomize
	rndNumber = Int(Rnd * UBound(arr))
	Response.Write arr(rndNumber) &"<br>"

Next

%>[/red]

Jag får inga felmeddelande på 100.000 försök ens.. :OO

Medlem sedan mars 20002 836 inlägg
#16

jag är helt hundra.

Rnd slumpar ett tal som är mindre än, nästan lika med 1 (0.9999) och då får du det sista indexet i arrayen som är tomt. Ingen bild kommer att visas.

Testa denna kod:

<%
strImage = "bild0;bild1;bild2;bild3;bild4;bild5;bild6;bild7;bild8;bild9;"

varyImage = Split(strImage,";")

For N = 0 TO 100
	Randomize Timer()
	rndNum = (rnd * UBound(varyImage))
	If Len("" & Trim(varyImage(rndNum))) = 0 Then
		Response.Write "ERROR: Tomt index!"
		Exit For
	End If
Next '## -- N --
%>

Testa sedan med att ta bort det sista ;

cya,
PatrikB

Medlem sedan apr. 20003 174 inlägg
#17

Du har helt säkert rätt, men faktum kvarstår dock.. ;) ..koden som jag postade tidigare fungerar problemfritt.
Använder liknande funktion på flera siter utan minsta problem.

Medlem sedan mars 20002 836 inlägg
#18

emellanåt så kommer det inte att visas en bild ... det är jag helt säker på :e

Din kod går igenom utan felmeddelanden, men när rnd blir nästan 1 så har du ett tomt index och ingen bild kommer att visas .... kanske dags att uppdatera kod?

UPPDATERAT:

Körde denna kod:

<%
strImage = "bild0;bild1;bild2;bild3;bild4;bild5;bild6;bild7;bild8;bild9;"

varyImage = Split(strImage,";")

For N = 0 TO 1000000
	Randomize
	rndNum = (rnd * UBound(varyImage))
	'Response.Write varyImage(rndNum) & "<br>"
	If Len("" & Trim(varyImage(rndNum))) = 0 Then
		'Response.Write "ERROR: Tomt index!"
		'Exit For
		I = I + 1
	End If
Next '## -- N --

Response.Write "Antal inträffade fel: " & I
%>

Den genererade ett tom index (det sista indexet) 50 000 ggr, dvs ca 5% av alla visningar kommer att sakna bild.

:SLUT UPPDATERAT

cya,
PatrikB

Medlem sedan apr. 20003 174 inlägg
#19

PatrikB skrev:

kanske dags att uppdatera kod?

Nja, eftersom den fungerar och syftet inte är att räkna tomma index utan att visa faktiska bilder,
så känner jag inget jättebehov att att uppdatera den. :p ;)
Men, jag lovat att jag ska uppdatera koden den dagen jag få fel på den.

Och tjurig som jag är skapade jag 10 småbilder och testkörde denna koden:

[red]<%

str = "bild1;bild2;bild3;bild4;bild5;bild6;bild7;bild8;bild9;bild10;"
arr = Split(str, ";")

For i = 0 To 100000

	randomize
	rndNumber = Int(Rnd * UBound(arr))
	Response.Write "<img src="""& arr(rndNumber) &".gif"" width=""10"" height=""10"">"

Next

%>[/red]

..och jag får faktiskt inte en enda bruten bild. :) bild

Medlem sedan juni 20022 599 inlägg
#20

PatrikB skrev:

Vad händer när rnd blir 1???

VBScriptmanualen skrev:

The Rnd function returns a value less than 1 but greater than or equal to 0.

278 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
135 ms — deklarationer (db)
0 ms — hämta statistik (cache)
141 ms — hämta tråd, inlägg och bilagor (db)
124 ms — ändringar (db)