webForumDet fria alternativet

slumpar mönster... =S

.NETur .NET

14 svar · 411 visningar · startad av greggan

Medlem sedan jan. 2004678 inlägg
Frågan#1

Hej

jag har gjort en grej som slumpar fram en användare

sub slumpa_click(obj as object, e as eventargs)
Dim cn as new OleDbConnection("PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=E:\Inetpub\databaser\tihi.mdb;")
Dim cmd as new OleDbCommand("SELECT TOP 1 userid FROM users order by RND(userid)",cn)
cn.open()
dim userid as string = cmd.ExecuteScalar()
cn.close()
huvudframe.attributes("src") = "userprofile.aspx?userid=" & userid
end sub

den fungerar och slumpar upp olika personer... men det konstigaste är att den slumpar efter ett mönster. den slumpar upp ca 10 olika användare sen börjar den om och slumpar upp användare igen i samma ordning.

Har jag gjort något dumt i koden? Kan jag göra det på något bättre sätt kanske?

redigerat: Jag kan tillägga att om jag kör frågan i access och skriver ut sqlen där så får jag massa olika och inget mönster följs.

Medlem sedan apr. 2004778 inlägg
#2

Nu har jag aldrig kört RND i en sql sats i Access men när man använder RND i "vanlig" kod så måste man alltid köra Randomize först för att "blanda om", eller vad man ska kalla det. Annars blir det alltid samma resultat.

Medlem sedan jan. 2004678 inlägg
#3

jag testade sätta dit randomize precis efter sub slumpa_click
men det blev ingen skillnad...

men det skumma är ju att om jag skriver ut sqlen i access så slumpar den upp olika hela tiden utan att det blir samma i rad osv...

det måste vara något fel på sidan på nåt sätt... om jag klickar snabbt på slumpaknappen så hinner jag se 20 olika användare innan den går tillbaks igen.. och sen är det alltid samma ordning men beroende på hur snabbt man klickar så får man se olika många innan den börjar om...

jättekonstigt... =/

Medlem sedan apr. 2004778 inlägg
#4

Inte alls konstigt.
Eftersom du har din RND funktion i SQL-satsen så spelar det inte så stor roll om du sätter Randomize i koden. Så detta har inget med koden att göra utan RND med Access.
Se om du kan googla fram något om hur man använder RND i Access.

Medlem sedan jan. 2004678 inlägg
#5

okej, jag testar det.. har suttit och letat i databasen efter mönster mellan dom användare som slumpas upp... men det finns inga likheter.... det här är verkligen skumt... men jag googlar lite. tack sålänge =)

Medlem sedan apr. 2004778 inlägg
#6

Som sagt, inte alls skumt. RND slumpar fram efter ett mönster, men mönstret har bara med Randomize att göra, inget annat.

Medlem sedan maj 20012 812 inlägg
#7

Om du vill så kan du göra så som du gör, du kan om du har problem med RND() använda dig av NewID() istället detta fungerar utmärkt.

Du har dock ett FET problem med att göra Order by RND()|NewID() och det är prestanda, så fort din tabell börjar innehålla lite fler rader, typ 1000 och fler så börjar du märka riktiga prestandaproblem.

Mitt tips blir istället att hämta alla användare till en dataTabel och sedan där slumpa fram ett "radsnummer" och plocka ut den raden med det "radsnummret".

- M

Medlem sedan jan. 2004678 inlägg
#8

har försökt google lite.. hittar lite saker... men vart ska jag lägga in randomize för att det ska funka?

Medlem sedan jan. 2004678 inlägg
#9

ofan.. jag har typ drygt 900 rader i databasen.. så det kanske inte är så hett... hur slumpar jag fram ett radsnummer att läsa av?

Medlem sedan jan. 2004678 inlägg
#10

jag har hittat massa nu men jag förstår inte riktigt. varför skriver man typ något i den här stilen:

randomize()
intRandomNumber = Int (1000*Rnd)+1

och sedan skriver man något liknande detta i sqlen

ORDER BY RND(" & intRandomNumber & "*ID)"

kommer man inte få fram något nummer då som den kommer köra order på? förstår inte riktigt. någon som har lust att förklara den koden? vad är 1000 som man tar gånger? vad händer om man har fler än 1000 poster i databasen? :q

redigerat: vad händer om jag inte har ett id för varje siffra? vissa idnummer kan ju saknas pga borttagna användare...

Medlem sedan apr. 2004778 inlägg
#11

Nu har du nog fattat Gladhs förslag lite fel.

Det du ska göra är:

1. hämta allt i databasen och lägg i en DataTable
2. Kör en Randomize och sedan en RND för siffror mellan 1 och antalet records i din DataTable
3. Den slumpade siffran minus 1 är det index i din DataTable du ska hämta. Du ska alltså inte anropa databasen med det slumpade numret och du ska inte köra RND i din sql-sats längre.

Siffrorna i RND funktionen bestämmer vilket intervall du ska ha siffrorna i.

CInt(Int((upperbound - lowerbound + 1) * Rnd() + lowerbound))

Med andra ord

CInt(Int((1000 + 1) * Rnd() + 1))

ger en siffra mellan 1 och 1000.
Men 1000 skall i ditt fall bytas ut mot antalet rader i din DataTable.

Medlem sedan jan. 2004678 inlägg
#12

okej, jag var fortfarande lite inne på att köra order by rnd()
men jag testar gärna dethär med datatable istället eftersom att jag inte får det andra att funka.

jag tror jag förstår processen över hur man gör detta, det enda jag inte vet är hur gör jag sedan, när jag slumpat fram ett nummer, för att läsa av det indexet från min datatable?

Medlem sedan nov. 20022 355 inlägg
#13

greggan skrev:

jag tror jag förstår processen över hur man gör detta, det enda jag inte vet är hur gör jag sedan, när jag slumpat fram ett nummer, för att läsa av det indexet från min datatable?

Läs PDahlen's sista inlägg och sista raden i det! :)

Medlem sedan jan. 2004678 inlägg
#14

PDahlen skrev:

Men 1000 skall i ditt fall bytas ut mot antalet rader i din DataTable.

jo det förstår jag.. men det jag undrar över är hur jag läser av en rad från datatable... jag har bara använt datatable för att presentera information på en sida... hur gör jag för att läsa av en rad sen?

Medlem sedan nov. 20022 355 inlägg
#15
datatable1.Rows[index][index]

där Rows är tupler/rader och nästa index är Kolumnerna i tabellen som då börjar med 0

r: såg att det var VB.NET

datatable1.Rows(index)(index)
140 ms totalt · 3 externa anrop · v20260731065814-full.4bcf49fe
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
138 ms — hämta tråd, inlägg och bilagor (db)