Avatar billede danielskipper Nybegynder
22. januar 2004 - 21:16 Der er 67 kommentarer

Difinerer random

Dette lille script finder et tilfældigt tal mellem 1 og 50 , men er det muligt at difinerer, eller rettere indsætte en variabel som gør sandsynlighenden større for at tallet bliver fra 1-25 end fra 25-50 ?

<%
  randomize
  tal = int((Rnd * 50) + 1)
%>
Avatar billede kabbak Professor
22. januar 2004 - 21:20 #1
Nu programmerer jeg ikke i asp, men i Visual Basic og VB6, jeg kender ingen måder til at lave det du spørger om.
Avatar billede kabbak Professor
22. januar 2004 - 21:26 #2
og dog i VB har jeg lavet dette, kan du få det over i Asp
Der er 2/3 chance for at det er mindre end 26

Dim Valg(3) As Integer
Randomize
Valg(1) = Int((Rnd * 50) + 1)
Valg(2) = Int((Rnd * 25) + 1)
Valg(3) = Int((Rnd * 25) + 1)
tal = Valg(Int((Rnd * 3) + 1))
Avatar billede arne_v Ekspert
22. januar 2004 - 21:31 #3
Vel 5/6 og ikke 2/3 ?
Avatar billede kabbak Professor
22. januar 2004 - 21:35 #4
ok jeg glente at lave den første om
Valg(1) = Int((Rnd * 50) + 26)
Avatar billede arne_v Ekspert
22. januar 2004 - 21:35 #5
Den pæne måde at gøre det på hvis man vil have 2/3 og 1/3 efter min mening er:

lav et array a med 75 elementer og værdier 1,1,...,25,25,26,...50

og slå op med:

tal = a(int(rnd*75)+1)
Avatar billede kabbak Professor
22. januar 2004 - 21:36 #6
Valg(1) = Int((Rnd * 25) + 26)

det går godt hva
Avatar billede arne_v Ekspert
22. januar 2004 - 21:36 #7
Valg(1) = Int((Rnd * 25) + 26)

og undskyld jeg blander mig sådan
Avatar billede kabbak Professor
22. januar 2004 - 21:37 #8
det er ok ;-))
Avatar billede danielskipper Nybegynder
22. januar 2004 - 22:08 #9
Når jeg erstatter:

  randomize
  tal = int((Rnd * 50) + 1)

med

Dim Valg(3) As Integer
Randomize
Valg(1) = Int((Rnd * 50) + 26)
Valg(2) = Int((Rnd * 25) + 1)
Valg(3) = Int((Rnd * 25) + 1)
tal = Valg(Int((Rnd * 3) + 1))

for jeg flg. fejl, hvad kan det skyldes?

Fejltype:
Der opstod en Microsoft VBScript-kompileringsfejl (0x800A0401)
Slut på sætning var ventet
Avatar billede eagleeye Praktikant
22. januar 2004 - 22:11 #10
prøv at skrive uden:  As Integer

og husk aray's starter fra plads 0 ikke 1 ;)
Avatar billede arne_v Ekspert
22. januar 2004 - 22:13 #11
så du synes at der skulle fjernes en del +1
Avatar billede eagleeye Praktikant
22. januar 2004 - 22:22 #12
Ja i den sidste linje som slår op i arrayet:  tal = valg(int(rnd*3))
samt Valg(1)=.. --> Valg(0)=.. osv


men jeg stemmer også mest p åløsningen med et array hvor man skrive tallene det antal gang man syntes de skal komme:

arr = split("1,1,2,2,3,3,4,4....25,25,26,27,28,29,....49,50",",")
randomize
tal = arr(Int(rnd*(ubound(arr)+1)))
Avatar billede erikjacobsen Ekspert
22. januar 2004 - 22:29 #13
Nu definerer spørgeren ikke hvad en større sandsynlighed egentlig er sådan rent
kvantitativt. En yderst simpel løsning er denne:

  randomize
  tal = int((Rnd * 50) + 1)
  if tal>25 then
    if rnd>0.5 then
      tal = int((Rnd * 50) + 1)
    end if
  end if

som vist giver tallene fra 1 til 25 66% større chance for at blive valgt.
Avatar billede kabbak Professor
22. januar 2004 - 22:29 #14
Dim Valg(3) As Integer
Randomize
Valg(1) = Int((Rnd * 25) + 26)' rettet ellers blev den største 75
Valg(2) = Int((Rnd * 25) + 1)
Valg(3) = Int((Rnd * 25) + 1)
tal = Valg(Int((Rnd * 3) + 1))


det skal være sådan
Avatar billede danielskipper Nybegynder
22. januar 2004 - 22:38 #15
kabbak >> jeg vil mene dit foreslag er mest overskuelig, men hvordan virker scriptet rent faktisk?
Hvordan beregnes tallet
Avatar billede kabbak Professor
22. januar 2004 - 22:41 #16
den finder 3 tal som bliver gemt i Valg(1) til Valg(3)

Valg(1) inderholder tal fra 16-50
Valg (2) og Valg(3) inderholder et tal mellem 1 og 25

Den sidate her 'tal = Valg(Int((Rnd * 3) + 1))' vælger et tal mellem 1 og 3
den bestemmer så hvilket af de 3 tal der skal bruges.
Avatar billede kabbak Professor
22. januar 2004 - 22:42 #17
16-50 = 26-50
Avatar billede danielskipper Nybegynder
22. januar 2004 - 22:48 #18
ok, men jeg forstår stadig ikke hvordan valg1 kan have tal fra 26-50 når der står 25+26
Hvis jeg forstår rigtig betyder taller +26) at den starter ved 26

Vil det så sige at hvis man ønsker at tallet 10 skal forekomme ofte, kan gøre flg.

Dim Valg(6) As Integer
Randomize
Valg(1) = Int((Rnd * 50) + 26)
Valg(2) = Int((Rnd * 25) + 1)
Valg(3) = Int((Rnd * 25) + 1)
Valg(4) = Int((Rnd * 10) + 10)
Valg(5) = Int((Rnd * 10) + 10)
Valg(6) = Int((Rnd * 10) + 10)
tal = Valg(Int((Rnd * 6) + 1))
Avatar billede nmh Nybegynder
22. januar 2004 - 22:49 #19
Her er endnu et forslag.

function f(p)
  if rnd<=p then
    f=1
  else
    f=0
end function

Lad p være et tal mellem 0 og 1.
Hændelsen f(p)=1 sker med sandsynligheden p

Udtrykket Int(Rnd(25)+1) + f(p)*25
giver et tal mellem 1 og 25 med sandsynligheden 1-p og et tal mellem 26 og 50 med sandsynligheden p.
Avatar billede nmh Nybegynder
22. januar 2004 - 22:50 #20
Ups: skrivefejl.
function f(p)
  if rnd<=p then
    f=1
  else
    f=0
  end if
end function
Avatar billede arne_v Ekspert
22. januar 2004 - 22:52 #21
0.0 <= rnd < 1.0
0 <= int(25*rnd) < 25
26 <= int(25*rnd) < 51
Avatar billede kabbak Professor
22. januar 2004 - 22:53 #22
Dim Valg(6) As Integer
Randomize
Valg(1) = Int((Rnd * 25) + 26)' 26-50
Valg(2) = Int((Rnd * 25) + 1) ' 1-25
Valg(3) = Int((Rnd * 25) + 1) ' 1-25
Valg(4) = Int((Rnd * 10) + 10)' 10-20
Valg(5) = Int((Rnd * 10) + 10)' 10-20
Valg(6) = Int((Rnd * 1) + 10) ' 10
tal = Valg(Int((Rnd * 6) + 1))
Avatar billede nmh Nybegynder
22. januar 2004 - 22:59 #23
Ny rettelse (jeg er vist blevet for træt nu):

det skal selvfølgelig ikke være Int(rnd(25)+1)+f(p)*25 men

Int(Rnd*25+1)+f(p)*25
Avatar billede danielskipper Nybegynder
22. januar 2004 - 23:10 #24
Tak for de mange forslag, men jeg er træt og kan knap nok finde ud af hvordan løsningen fra kabbak virker, er lidt forvirret lige nu.

kabbak >> er der nogen logisk forklaring på virkemåden, jeg kan ikke gennemskue hvordan fek.

Valg(6) = Int((Rnd * 1) + 10) ' 10
vælger tallet 10

Troede Rnd * 25 betyd at der ville blive fundet et tal op til 25, men det er altså ikke sådan det hænger sammen?
Avatar billede kabbak Professor
22. januar 2004 - 23:14 #25
Ved
Valg(6) = Int((Rnd * 1) + 10) ' 10
kan du ligesågodt skrive
Valg(6) = 10

Int((Rnd * 25) + 1) finder et tal fra og med 1 og til og med 25
Avatar billede nmh Nybegynder
22. januar 2004 - 23:15 #26
Hvilken sandsynlighed er det, du ønsker tallene fra 1 til 25 skal have?
Avatar billede danielskipper Nybegynder
22. januar 2004 - 23:21 #27
kabbak >> du må undskyld jeg spørger igen, men jeg forstår ikke at
Valg(6) = Int((Rnd * 1) + 10) vælger tallet 10 når du samtidig siger at
Int((Rnd * 25) + 1) finder et tal fra og med 1 og til og med 25

Jeg ser ikke nogen sammenhæng

nmh >> sandsynlighed fra 1 - 25 2/3 og fra 25 - 50 1/3
Avatar billede nmh Nybegynder
22. januar 2004 - 23:25 #28
Med den funktion f(p), jeg lavede tidligere vil udtrykket

Int(Rnd*25 + 1) + f(1/3)*25

give et tal mellem 1 og 25 med sandsynligheden 2/3 og tallene fra 26 til 50 kommer med sandsynlighden 1/3.

Funktionen f(1/3) er nemlig 1 med sandsynligheden 1/3 og 0 med sandsynligheden 2/3.
Avatar billede arne_v Ekspert
22. januar 2004 - 23:30 #29
rnd*25 = 0..24 så rnd*25+1 = 1..25
rnd*1 = 0..0 så rnd*1+19 = 10..10
Avatar billede danielskipper Nybegynder
22. januar 2004 - 23:41 #30
eagleeye >> jeg kan godt lide dit foreslag, nem at rediger, men jeg får flg. fejl

[Microsoft][ODBC Microsoft Access-driver] Der er en syntaksfejl i UPDATE-sætningen.
Avatar billede nmh Nybegynder
22. januar 2004 - 23:46 #31
arne>> Hvad mener du med dit seneste indlæg?

rnd*1+19=10..10 ????

Er det en kommentar til mit udtryk Int(Rnd*25 + 1) + f(1/3)*25 ?
Avatar billede eagleeye Praktikant
22. januar 2004 - 23:46 #32
Så må du prøve at vise din SQL sætning. Og bedre endnu prøv at udskrive din SQL sætning:
response.write SQL
response.end
lige før den linje som execute din sql sætning og vis det evt her, men det lyder som om den ikke får smidt data rigtigt ind i en kolonne.
Avatar billede arne_v Ekspert
22. januar 2004 - 23:49 #33
Det skulle være:

rnd*1+10=10..10

Og det var et svar på daniels 23:21:37 kommentar.
Avatar billede danielskipper Nybegynder
22. januar 2004 - 23:50 #34
eller >> arne_v..
Avatar billede danielskipper Nybegynder
22. januar 2004 - 23:53 #35
eagleeye >> hvis jeg bruger forslaget, og bare skriver et 1 som herunder virker det fint, tallet 1 vælges hver gang, skriver jeg så arr = split("1,2") får jeg fejlen

arr = split("1")
randomize
tal = arr(Int(rnd*(ubound(arr)+1)))
Avatar billede arne_v Ekspert
22. januar 2004 - 23:55 #36
Mangler du ikke ,"," i split kaldet ?
Avatar billede nmh Nybegynder
22. januar 2004 - 23:57 #37
Hvis man nu ønsker at tallene fra 1 til 25 skal komme med sandsynlighden 53/73, så er metoden med et array vist ikke den mest praktiske.
Avatar billede eagleeye Praktikant
22. januar 2004 - 23:57 #38
jeps som arne_v skrev. Hvis du ikke angiver en split karakter/streng, deler den default på mellemrum.. Så man skal enten bruge mellemrum "1 2" eller huske ,","
Avatar billede arne_v Ekspert
22. januar 2004 - 23:59 #39
nmh>

Jo - array teknikken er udmærket også med skæve tal.

Arrayet skal bare initialiseres på en anden måde.
Avatar billede arne_v Ekspert
23. januar 2004 - 00:05 #40
Noget helt andet.

Forudsat at random generatoren i VBScript opfører sig som i de fleste
andre sprog, så ville det være hensigtsmæssigt kun at kalde randomize
en gang og så rnd rigtigt mange gange.

Og da jeg ikke ville genkende et ASP script medmindre det var mejslet i
en flise og den faldt ned i hovet af mig, så ved jeg ikke hvordan man opnår
det i ASP/VBScript.
Avatar billede danielskipper Nybegynder
23. januar 2004 - 00:05 #41
Naturligvis >> arne_v
Så virker det :-)

Nmh >> det kan det være noget om, jeg vil kigge de forskellige forslag igennem og se hvilket der er bedst til opgaven, men jeg takker mange gange for jeres hjlæp, nu har jeg noget at arbejde med.
Avatar billede nmh Nybegynder
23. januar 2004 - 00:05 #42
Jo, men det er da en besværlig måde, når man blot kan lave en simpel funktion som er 0  eller 1 med ønsket sandsynlighed.
Det kan jo blive et ret stort array.
Avatar billede nmh Nybegynder
23. januar 2004 - 00:08 #43
Arne> Array-metoden: Det er da ret besværligt at skulle arbejde med et array, som jo i nogle tilfælde kan blive meget stort, når det, man opnår, kan klares helt simpelt med en funktion, der antager værdien 1 eller 0 med ønsket sandsynlighed.
Avatar billede arne_v Ekspert
23. januar 2004 - 00:14 #44
nmh>

arrayet er hurtigere end et ekstra rnd kald

og koden er også pænere ihvertfald i alt andet end dette simple tilfælde
(overvej funktions løsningen hvis de 50 tal havde hver sin individuelle
sandsynelighed)
Avatar billede eagleeye Praktikant
23. januar 2004 - 00:16 #45
nmh>> Tilgengæld kan man let for hvert tal give forskellig sansynlighed.
Så skulle man lave et array med tal og et med sansynligheden for tallet:

arr("1,2,3,4,5,6")
arrsansynlighed("10,1,9,20,30,30") 'summen skal give 100, alternativ løb igennem og brug i stedet for *100 på rnd

Så tage rnd fra 1..100:
f=Int(rnd*100+1)
s=0
for i=0 to ubound(arrsansynlighed)
  if f <= s then exit for
  s = s + arrsansynlighed(i)
next
tal = arr(i)
Avatar billede nmh Nybegynder
23. januar 2004 - 11:41 #46
eagleeye>
Ja, når der er tale om flere sandsynligheder, så skal man lave noget i stil med dit sidste indlæg.

Jeg ville nu nok akkumulere sandsynlighederne så intervallet fra 0 til 100 blev delt op i en række intervaller med delepunkter
10, 11, 20, 40, 70. Så kan man spare udregningen s=s+arrsandsynlighed(i), som jo udføres hver gang.

Nå man så kommer med et tilfældigt tal mellem 0 og 100, drejer det sig om at bestemme nummeret på det delinterval, det ligger i,
og så er problemet omformet til et søgeproblem.
Med et lille antal delepunkter bruges en if-then-else struktur eller en for-løkke til at bestemme nummeret på det interval, det tilfældige tal ligger i.
Avatar billede arne_v Ekspert
23. januar 2004 - 12:12 #47
Med stort array er der slet ikke nogen løkke eller if's.
Avatar billede nmh Nybegynder
23. januar 2004 - 12:42 #48
Arne>> Det har du ret i, men der vil være værdier for sandsynlighederne, hvor array-metoden vil give anledning til et meget stort array. Har man plads nok er det selvfølgelig ikke et problem.
Avatar billede eagleeye Praktikant
23. januar 2004 - 13:11 #49
nmh>> hvordan vil du lave din sådan man kan givet en sansynlighed til hvert tal?
Avatar billede nmh Nybegynder
23. januar 2004 - 13:22 #50
eagleeye>>
Jeg gør præcis det samme som du, men ved at benytte de akkumulerede sandsynligheder spares nogle udregninger.
Det første tal er arr(0) og det har sandsynligheden 10%, det næste er arr(1) og det har sandsynligheden 1%, tallet arr(2) har sandsynligheden 20% etc.
Det er det samme som du har gjort, men tallene 10,11,20,40,70 er blot fremkommet som sum af dine sandsynligheder.

Hvis det tilfældige tal er >=70 er tallet netop tal(5) og det kommer ud med sandsynligheden 30%.
Avatar billede eagleeye Praktikant
23. januar 2004 - 15:42 #51
Ja det rigtige men du er jo imod arrays så jeg tænkte å din function f(p)
Avatar billede arne_v Ekspert
23. januar 2004 - 16:03 #52
Principielt kunne det store arrays skulle blive meget stort men normalt
er det ikke noget problem i praksis. Hele procenter => 100 elementer.
Procenter med 1 decimal => 1000 elementer.
Avatar billede nmh Nybegynder
23. januar 2004 - 16:14 #53
eagleeye>> Jeg er ikke imod arrays som sådan, og med hele tal eller tal med 1 decimal som sandsynlighedsprocenter går det da fint. Skal der være mange forskellige sandsynligheder er det selvfølgelig nødvendigt at arbejde med arrays, og så kan det f.eks. gøres med dit eget forslag her til sidst med eller uden den lille ændring, jeg lavede.
Vi er nok ikke så uenige endda. :o)
Avatar billede danielskipper Nybegynder
24. januar 2004 - 11:55 #54
Er det muligt at komme i kontakt med jer direkte via email?
Avatar billede arne_v Ekspert
24. januar 2004 - 12:01 #55
Ja.

Men jeg vil kalde mig selv ekspert i pseudo random numbers og totalt
uvidende med hensyn til ASP, så ...
Avatar billede danielskipper Nybegynder
24. januar 2004 - 12:08 #56
Det var faktisk ASP jeg tænkte på
Avatar billede arne_v Ekspert
24. januar 2004 - 12:15 #57
så skal du nok have eagleeye på banen ...
Avatar billede danielskipper Nybegynder
24. januar 2004 - 12:47 #58
Kender du hans email? eller skal jeg lige vente til han dukker op?
Smider i forresten et svar, så jeg kan lukke og fordele point?
Avatar billede arne_v Ekspert
24. januar 2004 - 12:53 #59
Nej jeg kender ikke hans email og ved heller ikke om han vil poste den her.

Og der er sikkert også mange andre gode ASP folk.

Men hvis du kigge på top 10 i ASP så ...

:-)
Avatar billede danielskipper Nybegynder
24. januar 2004 - 12:59 #60
Ja jeg ser der er mange gode - mange points
så jeg finder ud af noget :-)
Avatar billede arne_v Ekspert
24. januar 2004 - 13:09 #61
Min pointe var at eagleeye er nummer 1 og har flere point end nummer 2, 3, 4 og 5
tilsammen.
Avatar billede danielskipper Nybegynder
24. januar 2004 - 13:15 #62
Jeg er også sikker på at han kan det der ASP :-)
Avatar billede eagleeye Praktikant
24. januar 2004 - 13:20 #63
Normalt opgiver jeg ikke icq eller email adresse..
Avatar billede eagleeye Praktikant
24. januar 2004 - 13:23 #64
doh... forsætter lige

Ja der er heldivis eller desværre mange i asp kotegorien som er gode alt efter hvem man spørger ;-O

Der er et par stykker af dem som er på top 10 som ikke er aktive mere, efter de kom ind på listen er de stoppet?? måske for at få en referance. Fordi man ligger højt er det ikke nødvendigvis fordi man er bedst. Jeg har være på eksprten i mange år og har i 2 år svare på spørgsmål så ialt bliver det jo mange point ;)
For de nye, som er lige så dygtige, tager det lidt tid før man kan se dem på top listen.
Avatar billede danielskipper Nybegynder
24. januar 2004 - 13:29 #65
Det har du selvfølgelig ret i.
Mit problem er at jeg er nået til noget ASP, som jeg ikke på nogen måde kan gemmenskue, hvis jeg skulle fremlægge alle disse her på eksperten, ville til tage for lang tid.
Så derfor søger jeg en ASP haj, som kan og vil hjælpe med disse ting, naturligvis for $$
Avatar billede arne_v Ekspert
24. januar 2004 - 13:39 #66
eagleeye>

Man kan ikke regne med at flere point = bedre. Fordi det er også meget et
spørgsmål om hvor meget tid man kan og vil bruge her.

Men rigtigt mange point indikerer et vist niveau. Specielt på det
praktiske område.
Avatar billede eagleeye Praktikant
24. januar 2004 - 13:51 #67
arne_v >> Ja jeg er helt enig med dig.
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