Avatar billede jih Nybegynder
08. december 2005 - 16:12 Der er 12 kommentarer og
1 løsning

forklaring til Rnd() funktionen

Hej,

Jeg har lavet et lille Su Doku spil derhjemme, og kunne tænke mig at bruge en Rnd() funktion til at få random levels frem. Jeg har mine levels liggende i en dll fil, og det virker fint, men indtil videre bliver jeg nødt til at skrive ind selv hvad for en level det skal være. (Ved at trykke nyt spil, så popper en boks frem som spørger om et nummer, som jeg så trykker ind)

Det jeg kunne tænke mig var at vide lidt mere om Rnd() funktionen, om det skal være links eller forklaringer. Nu har jeg længe været i tvivl om hvordan man skal bruge Rnd() funktionen. Jeg har selv brugt den mange gange, men kun ved at kopiere og sætte ind. Så denne gang kunne jeg tænke mig at få en ordentlig forklaring på hvorfor hvad for nogle tal/variabler skal stå hvor.
Er der nogen der kan hjælpe mig med dette, vil de få 100 lettjente points :-)

// WebPsycho
Avatar billede kabbak Professor
08. december 2005 - 16:19 #1
Dim MyValue, Response
Randomize  ' Initialize random-number generator.
Do Until Response = vbNo
  MyValue = Int((6 * Rnd) + 1)  ' Generate random value between 1 and 6.
  MsgBox MyValue
  Response = MsgBox ("Roll again? ", vbYesNo)
Loop

herfra
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/script56/html/vsstmrandomize.asp
Avatar billede jih Nybegynder
08. december 2005 - 16:29 #3
MSDN library giver aldrig grundige svar efter min mening.

kabbak >
- Vil det sige at du skal bruge Randomize før du bruger Rnd() ?
- MyValue = Int((6 * Rnd) + 1) ' 6 tallet gør at det er fra 1 til 6, eller har 1 tallet noget med det at gøre også?
- Hvis du har fået - fx - 4 ved et "kast", er der så lige stor chance for at det kommer igen næste gang du kører det igennem? (i samme loop)
Avatar billede sjh Nybegynder
08. december 2005 - 17:00 #4
..Int((6 * Rnd) + 1).. Ja hvis du fjerner  + 1  så vil du ikke få talet 6 men fra 0 til 5

Du kan gøre sådan.. så er du sikker på at det samme tal ikke kommer næste gang.
Private Sub Command1_Click()
  List1.AddItem MyRND(6)
End Sub

Public Function MyRND(intMax As Long) As Long
Dim intRnd As Long
Static intLarst As Long

  If intLarst = 0 Then
    Randomize
  End If

  intRnd = Int((intMax * Rnd) + 1)
  Do While intRnd = intLarst
    intRnd = Int((intMax * Rnd) + 1)
  Loop

  intLarst = intRnd
  MyRND = intRnd
End Function
Avatar billede bak Forsker
08. december 2005 - 19:54 #5
sakset fra hjælp

Randomize uses number to initialize the Rnd function's random-number generator, giving it a new seed value. If you omit number, the value returned by the system timer is used as the new seed value.

If Randomize is not used, the Rnd function (with no arguments) uses the same number as a seed the first time it is called, and thereafter uses the last generated number as a seed value.

Note  To repeat sequences of random numbers, call Rnd with a negative argument immediately before using Randomize with a numeric argument. Using Randomize with the same value for number does not repeat the previous sequence.
Avatar billede jih Nybegynder
09. december 2005 - 09:34 #6
hmmm... hvis det så skal være fra 20 til 30, er det så
-----
' Min forståelse af det, 1
Randomize
intRnd = Int((10 * Rnd) + 20)
' Min forståelse af det, 2
Randomize
intRnd = Int(((30 - 20) * Rnd) + 20) ' Som faktisk er det samme
' Eller
' Min forståelse af det, 3
intRnd = Int((30 * Rnd) + 20)
-----
Avatar billede jih Nybegynder
09. december 2005 - 09:36 #7
rettelse: det skulle så være:
-----
' Min forståelse af det, 1
Randomize
intRnd = Int((11 * Rnd) + 20)
' Min forståelse af det, 2
Randomize
intRnd = Int(((30 - 20 + 1) * Rnd) + 20) ' Som faktisk er det samme
' Eller
' Min forståelse af det, 3
intRnd = Int((30 * Rnd) + 20)
-----
Avatar billede bak Forsker
09. december 2005 - 15:59 #8
Sådan, hvilket svarer helt til dit eget eksempel nr 2.

firstnumber = 20
lastnumber = 30
Randomize
intRND = Int((Rnd() * (lastnumber + 1 - firstnumber))) + firstnumber
Avatar billede jih Nybegynder
12. december 2005 - 09:37 #9
Dim x, y, intRnd As Integer
x = 5 ' (bliver ved med at vokse - levels)
y = 0

intRnd = Int(((x - y + 1) * Rnd()) + y)

det vil sige at hvis y er første level og x er sidste level, så ville jeg kunne bruge den formel der, uanset hvad tallene er.. ikke..? Eller skal jeg fjerne det første "+ 1", hvis det starter med level 0? Tror eller jeg har sådan ca. fundet ud af det, fordi jeg har sat det op i programmet.. nu vil jeg bare vide om det så er anderledes, hvis y bliver sat til et andet tal..
Avatar billede bak Forsker
12. december 2005 - 17:20 #10
jeg er ikke helt enig i opbygningen, men hvis du retter
intRnd = Int(((x - y + 1) * Rnd()) + y)
til
intRnd = Int(((x - y + 1) * Rnd())) + y

så skulle der ikke være nogen problemer
Avatar billede jih Nybegynder
12. december 2005 - 18:42 #11
dvs. at hvis jeg har første level som 0, og sidste level som, lad os sige, 30.. så ville jeg kunne bruge
intRnd = Int(((30 - 0 + 1) * Rnd()) + 0) ? (kan ikke helt forstå hvorfor det skulle gøre nogen forskel om "+ y " er uden for eller indenfor Int() funktionen.. den måde at opstille det på gør det bare lettere for mig at overskue.. o.O)

hvis det er, så tag lige og smid et svar.. :)
Avatar billede bak Forsker
12. december 2005 - 21:25 #12
Det ser ud til at du har ret i at de er ens :-)
Jeg plejer bare at bruge min version...
og Ja, formlen kører fint
Avatar billede jih Nybegynder
13. december 2005 - 09:28 #13
der er lige en sidste ting jeg ikke helt forstår .. jeg har ikke brugt Randomize funktionen, men det virker fint alligevel.. kan jeg få en simpel forklaring på hvad den gør..? fordi jeg forstod ikke helt det du skrev:
--
Kommentar: bak
08/12-2005 19:54:33
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