Avatar billede food4u.dk Nybegynder
27. december 2001 - 22:28 Der er 34 kommentarer og
1 løsning

Random og \"vægt\"

Hejsa

Jeg skal lige have banket noget banner system sammen til food4u.dk. Men hvordan laver jeg et random udtræk med vægtning.

Altså hvis jeg har to banner, med vægtning:

banner1  vægt: 10
banner2  vægt: 100

Så skal der være 10 gange større chance for at det bliver banner2, end banner1. Man stadig random.

Lidt kriglet, håber i forstår :o)

/Christoffer
www.food4u.dk
Avatar billede erikjacobsen Ekspert
27. december 2001 - 22:37 #1
Kan gøres i MySQL direkte. Bruger du det?
Avatar billede cool_casper Nybegynder
27. december 2001 - 22:41 #2
Kan du ikke lave arrary hvor du har ti forskellige: 9 med banner2 og 1 med banner1. Og så vælge en random ud fra den?!? SÅ burde du statisk set have 10 gange størere change for at få banner2.
Avatar billede food4u.dk Nybegynder
27. december 2001 - 22:45 #3
Jeps, MySQL
Avatar billede erikjacobsen Ekspert
27. december 2001 - 22:48 #4
øv, food4u - så skal jeg jo lige til at tænke mig om. Hvodden var det lige det var ?  :)
Avatar billede food4u.dk Nybegynder
27. december 2001 - 22:52 #5
*lol*
Avatar billede erikjacobsen Ekspert
27. december 2001 - 23:32 #6
Nåh, til sagen. Den nemmeste måde er at putte 10 poster ind med banner2 og
1 med banner1 - for at give vægtningen mellem de to, og så fyre denne SQL af

  select *,rand() as r from banners order by r limit 0,1

Så får du én post tilbage, fordelt som ønsket. Kan generaliseres til flere bannere :)
Avatar billede food4u.dk Nybegynder
28. december 2001 - 09:07 #7
Så r er altså vægtningen?
Avatar billede erikjacobsen Ekspert
28. december 2001 - 09:54 #8
Nej r er et tilfældigt tal mellem 0 og 1. Alle 11 poster får en sådan værdi.
Én af dem er så mindst, og den vil blive valgt. I 10 ud af 11 tilfælde er det
banner2 og i 1 ud af 11 tilfælde er det banner1.
Avatar billede food4u.dk Nybegynder
28. december 2001 - 09:58 #9
skal et banner med vægten 10, så have 10 poster?
Avatar billede food4u.dk Nybegynder
28. december 2001 - 10:00 #10
he, det havde du jo skrevet en gang :o)

Kan det ikke gøre, så vægtningen ligger i posten?
Avatar billede erikjacobsen Ekspert
28. december 2001 - 10:22 #11
Tjah, det bliver lidt langhårede beregninger i SQL, efter mit hovede. Så kan
du ligesågodt læse de få bannere ind i et array og lave beregningerne i ASP.
Avatar billede Slettet bruger
28. december 2001 - 12:23 #12
Det nemmeste er nok at anvende ADRotator, der er indbygget i IIS. Du kan se et eksempel her:

http://activedeveloper.dk/download/default.asp?mode=showdownload&id=58
Avatar billede food4u.dk Nybegynder
28. december 2001 - 19:00 #13
Hmm, f.eks. på eads.dk, der sætter man bare at vægten skal være 10.

Men de vil jo nok ikke sige hvordan :o)
Avatar billede erikjacobsen Ekspert
28. december 2001 - 19:03 #14
Det kan vel ikke være så svært at programmere - det grænser til
det trivielle. Næh, det vil være en udfordring at gøre i én SQL-sætning
Avatar billede food4u.dk Nybegynder
28. december 2001 - 19:08 #15
hmm, \"grænser til det trivielle\"

jeg tro der er nogle der har bygget en kæmpe mur mellem mine evner og det trivielle *lol*

Men måske

Hvis nu jeg siger

SQL = \"select * from banner\"
set banner1 = conn.execute(SQL)

Kan jeg så søge idet resultat jeg får, f.eks.:
SQL1 = \"select banner from banner1\"
set....?
Avatar billede erikjacobsen Ekspert
28. december 2001 - 19:16 #16
Javel, ja, nu er mit \"food4thefamily\"-projekt overstået for i dag, så vi kan da
godt prøve at gøre det på den trivielle måde. Jeg har vist også nok ASP-salve - jeg
plejer at få røde knopper af at programmere ASP - så hvis du er tilfreds med en
ikke-smart løsning, hvor det hele ikke ligger i SQL-sætningen, så kan vi da godt tage
den. Er det OK med dig?
Avatar billede erikjacobsen Ekspert
28. december 2001 - 19:52 #17
Ok, så har jeg leget lidt :) Du kan afprøve scriptet på
  http://www11.brinkster.com/1script/food4u.asp
Og her er det - jeg håber du kan se hvad der er relevant og hvad der bare er
til aftestning:

<!-- #include file=\"adovbs.inc\" -->
<html>
<head>
<title>food4u</title>
</head>
<body>
<%
Dim Connect,rs
Set Connect = Server.CreateObject(\"ADODB.Connection\")
DSN = \"DRIVER={Microsoft Access Driver (*.mdb)};DBQ=\" & server.mappath(\"db/food4u.mdb\")
Connect.Open DSN

Set rs = Server.CreateObject(\"ADODB.Recordset\")

dim banner(10),weight(10)

count=-1
sum=0
rs.Open \"SELECT banner,weight FROM banners\",Connect,adOpenStatic,adLockOptimistic
do until rs.EOF
  Response.write rs(\"banner\") & \" \" & rs(\"weight\") & \"<br>\"
  count=count+1
  banner(count) = rs(\"banner\")
  weight(count) = rs(\"weight\")
  sum=sum+rs(\"weight\")
  rs.MoveNext
loop
rs.Close

response.write sum & \"<br>\"

for i=0 to count
  response.write banner(i) & \" \" & weight(i) & \"<br>\"
next

Randomize
for i=0 to 100
  which = int(rnd()*sum)+1
  response.write which & \" \"
  bannervalgt=\"\"
  for j=0 to count
    if (1 <= which) and (which <= weight(j)) then
      bannervalgt=banner(j)
    end if
    which=which-weight(j)
  next
  response.write bannervalgt & \"<br>\"
next
%>


</body>
</html>
Avatar billede food4u.dk Nybegynder
28. december 2001 - 23:29 #18
Hej Erik

Jeg skal lige have kigget lidt på det kode der, kan ikke helt gennemskue det :O)

Smidder du ikke et svar, du har fortjent nogle point
Avatar billede erikjacobsen Ekspert
28. december 2001 - 23:33 #19
Nej da, jeg skulle da nødig give indtryk af at vide noget om ASP.
Det er skam ganske gratis

Erik \"livet er for kort til ASP\" Jacobsen

PS: Spørg endelig løs. Du skal nok kun bruge 1/3 af koden - væk med alle
testudskrifter og så\'n
Avatar billede food4u.dk Nybegynder
29. december 2001 - 00:08 #20
hmm, du bruger altså PHP ?
Avatar billede erikjacobsen Ekspert
29. december 2001 - 00:12 #21
Er det de eneste 2 muligheder i verden? Der er da masser af
andre, men ASP er den ultimativt mest tåbelige at spilde sin
ungdom på. Syn\'s jeg.
Avatar billede food4u.dk Nybegynder
29. december 2001 - 00:15 #22
Hmm, jeg ved godt det er som at spørge en fra venstre, om man skal stemme på Socialkrabaterne, men kan det betale sig at skifte til noget andet?

Jeg mener, så skal jeg til at lære et helt nyt sprog.

Hvad ville du foreslå?
Avatar billede erikjacobsen Ekspert
29. december 2001 - 00:18 #23
Jamen så bliv da ved ASP indtil du får brug for noget andet
Avatar billede food4u.dk Nybegynder
29. december 2001 - 00:22 #24
Ok :o)
Avatar billede food4u.dk Nybegynder
29. december 2001 - 01:39 #25
Jeg lukker lige når du alligevel ikke vil have point :o)

Sidder lige og overveje, at skifte helt til Linux, er igang med at hente staroffice

Godt nytår, og tak for hjælpen i det gamle
Avatar billede food4u.dk Nybegynder
06. januar 2002 - 21:45 #26
hej Erik

gider du forklare hvad der sker her:
which = int(rnd()*sum)+1
  response.write which & \" \"
  bannervalgt=\"\"
  for j=0 to count
    if (1 <= which) and (which <= weight(j)) then
      bannervalgt=banner(j)
    end if
    which=which-weight(j)
  next
Avatar billede erikjacobsen Ekspert
06. januar 2002 - 22:03 #27
Har du vægtene 7, 9, 13, 20, 33, 14 som tilsammen giver summen 96, vælger du
et tal mellem 1 og 96. Det kalder vi which, for hvad skulle det ellers hedde, nu
julen er veloverstået.

Lad os sige which så er blevet til 50. Hvad får en af mulighederne er det så?
Jo, 1..7 er den første, 8..16 er de næste 9, og .... regn selv efter.... Så vi skal hen
til mulighed hvor 50 ligger i intervallet.

Det gør vi ved at kigge på 7. Næh, 50 ligger ikke mellem 1 og 7. Så gør vi noget
smart, og det glæder mig at du undres lidt over det, for det er sådan lidt et
\"hack\". Vi trækker nemlig 7 fra de 50, og det giver, øh, 43. Det ligger heller ikke
i 1..9, så vi trækker 9 fra: 34. Ej heller i 1..13, så: 21. Ikke i 1..20, så: 1.
Og ja, det ligger i 1..31, så det er det banner, der bliver valgt.

Så kunne vi have standset for-løkken, men det her er jo ASP, så jeg ved ikke hvordan
man gør det, men det betyder nu ingenting.

Jeg håber du kan se, at bannere med stor vægt har tilsvarende større sandsynlighed
for at blive valgt.
Avatar billede food4u.dk Nybegynder
06. januar 2002 - 22:08 #28
Det sgu smart, og så siger du at du ikke er godt til ASP *lol*

Takker mange gange
Avatar billede erikjacobsen Ekspert
06. januar 2002 - 22:10 #29
Jamen, jeg gider bare ikke spilde min ungdom på ASP.
Avatar billede food4u.dk Nybegynder
06. januar 2002 - 22:11 #30
Avatar billede erikjacobsen Ekspert
06. januar 2002 - 22:22 #31
\"Hvor finder jeg en pige,  som er båd sød, rig og smart?\"

Den fik jeg, men jeg kendte nu svaret i forvejen. Det er min kone :)
Avatar billede erikjacobsen Ekspert
06. januar 2002 - 22:25 #32
Men, food4u.dk - kigger (og klikker) du nogensinde på et banner?
Jeg gør da af og til - men jeg kigger ikke på banneret før jeg har
har læst siden og klikket mig videre. Så er der ikke noget mere
irriterende end at komme til den nye side, og så er det spændende
banner fra den anden side væk, og det kommer ikke igen.... øv.

Man burde vise samme banner i nogle minutter af gangen, og så skifte.
Avatar billede food4u.dk Nybegynder
06. januar 2002 - 22:27 #33
:o)

Hmm, det er der noget om.

Det må jeg lave, så når den har fundet et tilfældigt banner, så sætter den først et nyt ind, når tiden er gået.
Avatar billede erikjacobsen Ekspert
06. januar 2002 - 22:41 #34
Man kunne opdele døgnet, så bannere blev vist i minutintervaller, svarende
til vægtningen.

Jeg gør noget andet. Jeg skifter banneret med en dag (eller 3 ...) mellemrum.
Manuelt. Men nu skal jeg jo heller ikke leve af det.
Avatar billede food4u.dk Nybegynder
06. januar 2002 - 22:50 #35
Kan jeg lokke dig til at kigge her:
http://www.eksperten.dk/spm/155234

Hvad har du af sider?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester