[VBA] Hoe random waarde krijgen uit verschillend..

Pagina: 1
Acties:
  • 318 views sinds 30-01-2008
  • Reageer

  • Hu9o
  • Registratie: Mei 2001
  • Laatst online: 17-09 20:43

Hu9o

Schokkend

Topicstarter
Hoe kan ik in vba een random waarde krijgen uit een wisselend aantal constante.

Wat ik hierboven probeer duidelijk te maken is dat ik een random getal wil hebben van 1 tm 6. Maar soms is het zo dat bijvoorbeeld dit getal geen 4 of 5 mag wezen. En nu wil ik niet dat er dan weer een nieuw random getal gemaakt wordt. Er moet dus van tevoren een willekeurige waarde gekozen worden uit 1,2,3 of 6.

Weet iemand hoe ik dit doe??

>>>>>>>>>>>>>>>>>>>>>>>>>Vertel Microsoft over dit probleem <<<<<<<<<<<<<<<<<<<<<<<<<


Verwijderd

Stel je weet wanneer 4 en 5 niet mee mogen doen. Maak dan een array met de te kiezen waarden en randomize de onderdelen uit het array bv:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Dim x(1 to 6) as Integer
Dim Waarde as Integer

x(1)=1
x(2)=2
x(3)=3
x(4)=6
x(5)=4
x(6)=5

'// nu kiezen uit waarden waar 4 en 5 niet meetellen
Waarde = x(Int((4 * Rnd) + 1))

'// nu kiezen uit waarden waar 4 en 5 wel meetellen
Waarde = x(Int((6 * Rnd) + 1))

N-joy

  • Tim Schuhmacher
  • Registratie: Januari 2000
  • Laatst online: 17-09 12:33

Tim Schuhmacher

abasios

een lijst of array oid met

[1,2,3,4,5,6]
getallen die er niet in mogen haal je er uit.
[1,2,3,4,5,6] - [4,5] = [1,2,3,6]

dan
random(4)+1 en het zoveelste getal neem je uit [1,2,3,6] lijstje.

Misschien dat er een nettere manier is

  • Hu9o
  • Registratie: Mei 2001
  • Laatst online: 17-09 20:43

Hu9o

Schokkend

Topicstarter
Ok, wat jullie zeggen is inderdaad wel goed. Maar ik heb het blijkbaar niet helemaal goed uitgelegt.

Ik heb als voorbeeld genomen om 4 en 5 er uit telaten. Maar in het programma waar ik het in gebruik is het niet altijd 4 en 5.
In het begin doen ze allemaal mee. En elke keer worden er meer getallen uitgesloten.


[background info]
De code komt uit een projectje van me, het maakt onderdeel uit van Master Mind. De getallen stellen kleuren voor. Het is de bedoeling dat de computer de code kraakt, aan de hand van de getallen die nog mee doen (alles behalve 4 en 5, uit het voorbeeld) moet hij dan een volgende beslissing nemen.
[/background info]

>>>>>>>>>>>>>>>>>>>>>>>>>Vertel Microsoft over dit probleem <<<<<<<<<<<<<<<<<<<<<<<<<


  • The - DDD
  • Registratie: Januari 2000
  • Laatst online: 03-09 16:40
Ik prog het effe in C++:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int[] getallen = {1,2,3,4,5,6};
int lengte = 6;
int index = 0;
int teBewerkenWaarde = 0;

...
...
...

//Genereer een random getal van maximale groote lengte...
//Da's dus bij een float random met bereik [0.0 <-> 1.0]:
index = (int)floor(random * lengte);

//Doe wat je wilt met de waarde op getallen[index]
teBewerkenWaarde = getallen[index];

for (i = index; i < lengte-1; i++)
{
   getallen[i] = getallen[i+1];
}
lengte = lengte - 1;

Je kiest dus elke keer een random getal en vervolgens flikker je die uit je array met getallen en schuif je alles na dat getal een plaatsje op en verlaag je de lengte van de array zodat je weer opnieuw kan selecteren. (met hetzelfde stukje code...)

  • Kappie
  • Registratie: Oktober 2000
  • Laatst online: 17-09 21:34

Kappie

Tell me your secrets...

Je maakt een Array aan waarin je de getallen neerzet die je al gebruikt hebt. Daarna controleer na elk random getal of deze al bestaat.

Zie code hieronder:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Sub RandomReeks()
' Geeft een reeks getallen in een willekeurige volgorde
  ondergrens = 4
  bovengrens = 10
  Reeks = bovengrens - ondergrens + 1
  ReDim Getallen(Reeks)
  For i = 1 To (Reeks)
    GetalOk = False
    Do Until GetalOk
    GetalOk = True
    Getal = Int(((Reeks) * Rnd) + 1) + ondergrens - 1
    For j = 1 To i
      If Getallen(j) = Getal Then GetalOk = False
    Next j
    Loop
    Getallen(i) = Getal
    MsgBox (Getal)
 Next i
End Sub

Veel succes!

He does fit the profile perfectly. He's intelligent, but an under-achiever; alienated from his parents; has few friends. Classic case for recruitment by the Soviets.


  • Hu9o
  • Registratie: Mei 2001
  • Laatst online: 17-09 20:43

Hu9o

Schokkend

Topicstarter
Op dinsdag 02 oktober 2001 01:19 schreef Kappie het volgende:
Je maakt een Array aan waarin je de getallen neerzet die je al gebruikt hebt. Daarna controleer na elk random getal of deze al bestaat.

Zie code hieronder:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Sub RandomReeks()
' Geeft een reeks getallen in een willekeurige volgorde
  ondergrens = 4
  bovengrens = 10
  Reeks = bovengrens - ondergrens + 1
  ReDim Getallen(Reeks)
  For i = 1 To (Reeks)
    GetalOk = False
    Do Until GetalOk
    GetalOk = True
    Getal = Int(((Reeks) * Rnd) + 1) + ondergrens - 1
    For j = 1 To i
      If Getallen(j) = Getal Then GetalOk = False
    Next j
    Loop
    Getallen(i) = Getal
    MsgBox (Getal)
 Next i
End Sub

Veel succes!
Bedankt, werkt perfect!

>>>>>>>>>>>>>>>>>>>>>>>>>Vertel Microsoft over dit probleem <<<<<<<<<<<<<<<<<<<<<<<<<


  • Hu9o
  • Registratie: Mei 2001
  • Laatst online: 17-09 20:43

Hu9o

Schokkend

Topicstarter
Op dinsdag 02 oktober 2001 01:19 schreef Kappie het volgende:
Je maakt een Array aan waarin je de getallen neerzet die je al gebruikt hebt. Daarna controleer na elk random getal of deze al bestaat.

Zie code hieronder:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Sub RandomReeks()
' Geeft een reeks getallen in een willekeurige volgorde
  ondergrens = 4
  bovengrens = 10
  Reeks = bovengrens - ondergrens + 1
  ReDim Getallen(Reeks)
  For i = 1 To (Reeks)
    GetalOk = False
    Do Until GetalOk
    GetalOk = True
    Getal = Int(((Reeks) * Rnd) + 1) + ondergrens - 1
    For j = 1 To i
      If Getallen(j) = Getal Then GetalOk = False
    Next j
    Loop
    Getallen(i) = Getal
    MsgBox (Getal)
 Next i
End Sub

Veel succes!
Toch nog ff een klein vraagje, er staat:
Do Until GetalOk
Wat wordt er dan gedaan totdat getalok???
De code werkt wel, maar ik snap niet helemaal wat er staat. Als je er van maakt do until getalok=false dan krijg je gewoon 6 popups met niks er in.
Zet ik er neer getalok = truem, dan krijg ik hetzelfde resultaat als zonder = true.

Dus, wat staat er nou precies?? zou je dat nog ff kunnen antwoorden?

>>>>>>>>>>>>>>>>>>>>>>>>>Vertel Microsoft over dit probleem <<<<<<<<<<<<<<<<<<<<<<<<<


Verwijderd

code:
1
2
3
4
5
GetalOk = True
Getal = Int(((Reeks) * Rnd) + 1) + ondergrens - 1
   For j = 1 To i
     If Getallen(j) = Getal Then GetalOk = False
   Next j

Dit gebeurt er :) Do while ... loop omsluit acties die uitgevoerd moeten worden totdat iet voldoet aan de vergelijking achter while. In dit geval: kies een random getal en kijk of dat getal mag gebruikt worden. Zo ja, stop de lus door GetalOk op True te houden; zo nee, laat de loop doorgaan door GetalOk op False te zetten. Simpel toch *-)
Pagina: 1