/ Forside / Teknologi / Udvikling / ASP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
ASP
#NavnPoint
smorch 9259
Harlekin 1866
molokyle 1040
Steffanst.. 758
gandalf 657
smilly 564
gibson 560
cumano 530
MouseKeep.. 480
10  Random 410
Det evige problem med RANDOM
Fra : Jacob ..


Dato : 23-03-04 20:46

Jeg har en ACCESS DB (database.mdb), med tabellen tblResultater
(her i 100 rækker).

Hvordan formulerer jeg et loop der selecter 5 tilfældige rækker?

Jeg har googlet og jeg har søgt, men kan ikke komme op med en
brugbar strSQL med tilhørende loop?

Nogen der kan hjælpe?

--
Vil du lære at kode HTML, XHTML, CSS, SSI eller ASP?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

 
 
Jens Gyldenkærne Cla~ (23-03-2004)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 23-03-04 21:36

Jacob .. skrev:

> Jeg har en ACCESS DB (database.mdb), med tabellen tblResultater
> (her i 100 rækker).
>
> Hvordan formulerer jeg et loop der selecter 5 tilfældige rækker?

Svaret er ikke anderledes end da du spurgte om 3 tilfældige rækker
(8. marts). Prøv at genlæse trådene fra dengang.
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Jacob Læssøe Nielsen (23-03-2004)
Kommentar
Fra : Jacob Læssøe Nielsen


Dato : 23-03-04 21:59


> Svaret er ikke anderledes end da du spurgte om 3 tilfældige rækker
> (8. marts). Prøv at genlæse trådene fra dengang.

Jeg synes bare at indlæget lynhurtigt udviklede sig til noget uforståeligt
snak om primtal og fordelingstal, derfor poster jeg den påny for at andre
evt. kunne omme på banen. Fælte lidt at det blev en strid om snilde og
færdigheden

Men det er jo nok min egen fejl. Jeg burde nok have haft indikeret at jeg
trods alt er en eller anden grad af newbie som blot søger en simpel løsning.


---
Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.620 / Virus Database: 399 - Release Date: 11-03-2004



Jens Gyldenkærne Cla~ (23-03-2004)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 23-03-04 22:26

Jacob Læssøe Nielsen skrev:

> Jeg synes bare at indlæget lynhurtigt udviklede sig til noget
> uforståeligt snak om primtal og fordelingstal,

Det er en ærlig sag - men så synes jeg bare du skulle have gjort
opmærksom på det (eller i hvert fald fortælle når du nu genposter
at du havde problemer med at forstå de svar du fik første gang).

> Fælte lidt at det blev en strid om snilde og færdigheden

Tråden udviklede sig også ganske voldsomt. En ting står vist
rimelig fast - der er ikke nogen helt god metode til randomvalg af
flere poster i Access.

To metoder var i spil dengang. Den ene er Torben Brandts model:
<http://actuar.dk/torben/show.asp?id=randomrecords>. Den skulle
virke og give en rimelig fordeling - men have problemer med
hastigheden hvis tabellen har mange poster.

Michael Zedeler foreslog en anden model. Den var der en del debat
om - dels fordi den ikke kunne anvendes direkte i Access med den
syntaks og de tal der var brugt i eksemplet, og dels fordi der var
uenighed om hvorvidt fordelingen af posterne var i orden (altså om
tilfældigheden i udvælgelsen var stor nok til at give alle poster
samme vægtning).

Torben Brandt foreslog senere følgende:
,--------
| Alternativt kan du trække id'erne fra posterne ud af tabellen.
| Gemme dem som et array (evt med rs.GetRows)
| Så kan du se hvor lang array'et er
| Vælg et tilvældigt heltal (Int(Rnd * antalPoster))
| Find hvilket id, der er på den tilsvarende plads i array'et
| Træk denne post ud af databasen.
`--------

Sidstnævnte synes jeg lyder tiltalende. Specielt vil jeg tro at
metoden kan bruges hvis tabellen er nogenlunde statisk - altså at
der ikke tilføjes eller slettes poster hele tiden. I det tilfælde
kan man nemlig gemme arrayet i en variabel på serveren
(applicationvariabel) og dermed holde hele randomdelen fri for
databasekald. Metoden skal dog nok udvides en smule for at få flere
poster ud - men det kan stadig gøres direkte i asp.
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Jacob Læssøe Nielsen (23-03-2004)
Kommentar
Fra : Jacob Læssøe Nielsen


Dato : 23-03-04 23:11

Tak for forklaringerne. Stof til eftertanke!

Hvad er der i grunden galt med at bruge SELECT TOP 5 * FROM tbl ORDER BY
Rnd([ID]) ?


---
Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.620 / Virus Database: 399 - Release Date: 11-03-2004



Jens Gyldenkærne Cla~ (24-03-2004)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 24-03-04 10:35

Jacob Læssøe Nielsen skrev:

> Hvad er der i grunden galt med at bruge SELECT TOP 5 * FROM
> tbl ORDER BY Rnd([ID]) ?

Heureka! - jeg tror faktisk at du har fundet den rigtige løsning.

Problemet med bare at bruge Rnd() er at funktionen kun evalueres én
gang for hele forespørgslen. Men det gælder ikke hvis man giver et
variabelt argument til funktionen.

Metoden er beskrevet her
<http://support.microsoft.com/default.aspx?scid=kb;EN-US;208855>

Jeg har kørt en minitest af metoden, og den ser ud til at virke
fint. Det vil dog nok være en god ide at tjekke hvordan den opfører
sig ved lidt større datamængder.
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Torben Brandt (25-03-2004)
Kommentar
Fra : Torben Brandt


Dato : 25-03-04 19:37

Jens Gyldenkærne Clausen skrev:
> Jacob Læssøe Nielsen skrev:
>
>>Hvad er der i grunden galt med at bruge SELECT TOP 5 * FROM
>>tbl ORDER BY Rnd([ID]) ?
>
> Heureka! - jeg tror faktisk at du har fundet den rigtige løsning.
>
> Problemet med bare at bruge Rnd() er at funktionen kun evalueres én
> gang for hele forespørgslen. Men det gælder ikke hvis man giver et
> variabelt argument til funktionen.
>
> Jeg har kørt en minitest af metoden, og den ser ud til at virke
> fint. Det vil dog nok være en god ide at tjekke hvordan den opfører
> sig ved lidt større datamængder.

Med fare for at diskussionen igen løber af sporet så vil jeg lige byde
ind med en bemærkning :)

Jeg var lige ved at skrive et rosende indlæg idet en kodestump i stil med:
åbn database
gentag et vist antal gange
udtræk efter "select top 1 felt from tabel order by rnd(id)"
gem id fra første post i udtræk
slut gentag
luk database
se på fordelingen af de gemte første poster
giver en helt perfekt ligefordeling.

Men så prøvede jeg denne:
gentag et vist antal gange
åbn database
udtræk efter "select top 1 felt from tabel order by rnd(id)"
gem id fra første post i udtræk
luk database
slut gentag
se på fordelingen af de gemte første poster
hvor databasen er nyåbnet ved hvert udtræk. I dette tilfælde får jeg
samme udtræk hver gang. Hvilket svarer til at Rnd() i ASP/VBS også er
deterministisk hvis man ikke skriver randomize.

Det er desværre det sidste tilfælde, hvor databasen er nyåbnet, der
ligner virkeligheden bedst, idet databasen jo også er nyåbnet når et nyt
banner (eller hvad det måtte være) skal vises til brugeren.

> Metoden er beskrevet her
> <http://support.microsoft.com/default.aspx?scid=kb;EN-US;208855>

Det handler vist kun om hvis man kører VBA (eller hvad man kan køre)
direkte i Access. Her vil man bla. kunne køre randomize inden og
forbindelsen til databasen bliver ikke åbnet og lukket hele tiden.

Hvis jeg er gal på den, så råb endelig op :)
Torben


Jens Gyldenkærne Cla~ (24-03-2004)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 24-03-04 12:33

Jens Gyldenkærne Clausen skrev:

> Jeg har kørt en minitest af metoden, og den ser ud til at
> virke fint. Det vil dog nok være en god ide at tjekke hvordan
> den opfører sig ved lidt større datamængder.

Nu har jeg testet lidt mere.

Første omgang - datatabel med 50 poster, autoid fra 1-50 (ingen
huller i rækken).

Jeg kørte følgende VBA-kode:

Sub testme()
Dim i As Integer
For i = 1 To 100
CurrentDb.Execute _
"INSERT INTO stat ( tID ) " & _
"SELECT TOP 3 Tabel1.Id FROM Tabel1 " & _
"ORDER BY Rnd(id);"
Next
End Sub


Efter en kørsel havde to poster været udtrukket én gang (id 3 og
19), mens de to poster der havde været udtrukket flest gange var id
25 og 42 (13 gange). Ikke nogen særlig god fordeling - men alle
poster havde dog været udtrukket.

Efter yderligere 3 kørsler (1200 udtræk i alt) var de mindst
populære id-numre 12, 30, 41 og 48 med hver 15 trækninger. Mest
populære id-nummer var her nr. 17 med 34 trækninger.

Nyt forsøg - stadig med 50 rækker, denne gang med huller i id-
værdierne (laveste id = 3, højeste id = 83).

Første kørsel af koden (300 rækker): 4 id-numre udtrukket 2 gange
(laveste), 2 rækker udtrukket 11 gange (højeste). Alle rækker
udtrukket mindst én gang.

Efter fire kørsler (1200 rækker): Et id-nummer (43) med 16
trækninger (laveste). Et id-nummer med 35 trækninger (højeste).

Så vidt jeg kan vurdere er det ikke en overvældende god fordeling,
men hvis man kan leve med at alle poster ikke udtrækkes lige ofte,
så er det en nem og hurtig metode.


NB: For en ordens skyld bør jeg oplyse at resultaterne fra den
første omgang (med id fra 1-50) er opnået med en løkke på 101
forespørgsler (i = 0 TO 100) - det vil sige 303 og 1212 rækker i
stedet for 300 og 1200. Det ændrer dog ikke på det samlede billede.

Testen er foretaget på Access 2000 SP3 under Windows 2000.
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Jens Gyldenkærne Cla~ (25-03-2004)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 25-03-04 22:45

Torben Brandt skrev:

> Med fare for at diskussionen igen løber af sporet så vil jeg
> lige byde ind med en bemærkning :)

Bryd endelig ind - det er til gavn for alle.


> Det er desværre det sidste tilfælde, hvor databasen er
> nyåbnet, der ligner virkeligheden bedst, idet databasen jo
> også er nyåbnet når et nyt
> banner (eller hvad det måtte være) skal vises til brugeren.

Du har ret. Jeg tænkte ikke på at asp-kode i modsætning til vba-
kode typisk vil åbne og lukke databasen hver gang.
Øv - men tak for informationen.
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Søg
Reklame
Statistik
Spørgsmål : 177549
Tips : 31968
Nyheder : 719565
Indlæg : 6408820
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste