Pagina 1 van de 6 123 ... LaatsteLaatste
Resultaten 1 tot 10 van de 54

Onderwerp: random getallen trekken

  1. #1
    Geregistreerd
    Dec 2006
    Berichten
    1.940

    Standaard random getallen trekken

    Hallo allemaal,
    Ik wil graag een aantal getallen van 4 cijfers random trekken uit de cijfers 1 t/m 8. Dat zou simpel gaan met de functie =ASELECTTUSSEN(), met als laagste getal is 1234 en het hoogste getal is 8765. Maar er zijn een paar voorwaarden en dan gaat deze functie niet goed.
    1. In het getrokken getal mag geen nul voorkomen. B.v. 4021. De nul zit niet in de cijfers 1 t/m 8.
    2. In het getrokken getal mag elk cijfer slechts eenmaal voorkomen, b.v. 4421 is fout.
    3. Alle cijfers ( 1 t/m 8) in alle getrokken getallen dienen zo gelijk mogelijk in aantal keren voor te komen.
    4. Ik wil het aantal getallen dat getrokken moet worden opgeven b.v. 48 x.

    Natuurlijk kun je met de functie =ASELECTTUSSEN(1234;8765) wel een serie getallen maken en vervolgens via controle een aantal “foute” getallen signaleren. Maar een evenwichtige verdeling over alle cijfers wil nog niet lukken.

    Ik denk dat het wel een VBA trucje zal worden en daar heb ik geen kaas van gegeten.

    Groet
    Dirk
    Bijgevoegde Bestanden Bijgevoegde Bestanden

  2. # ADS
    Geregistreerd
    Always
    Berichten
    Many
     
  3. #2
    Geregistreerd
    Jul 2011
    Berichten
    758

    Standaard

    Beste,

    Het zal inderdaad programmeerwerk in VBA worden. Een oplossing om te voorkomen dat een cijfer slechts eenmaal voorkomt in een getal , zie ik niet onmiddellijk. Bepaalde forumleden weten daar wel raad mee.
    Hoe meer beperkingen je aan de getallen verbindt, hoe trager de getallen zullen gevonden worden en hoe minder getallen aan de voorwaarden zullen voldoen.

    mvg,
    berre51

  4. #3
    Geregistreerd
    Jun 2008
    Berichten
    5.983

    Standaard

    Code:
     
    Sub snb()
        Randomize
     
        Do
          x = Int(Rnd * 10)
          If x > 0 And InStr(c01, x) = 0 Then c01 = c01 & x
        Loop Until Len(c01) = 4
     
        MsgBox c01
    End Sub
    Een evenwichtige verdeling is altijd het geval bij random getallen.
    Bij voldoende grote aantallen komen alle cijfers even vaak voor; anders zou er geen sprake zijn van random getallen.
    In kleine steekproeven kan er geen sprake zijn van een evenwichtige verdeling.
    Als je dat toch wil realiseren is dat strijdig met random gegenereerde getallen.
    Laatst gewijzigd door snb; 07-09-12 om 00:02.

  5. #4
    Geregistreerd
    Nov 2005
    Berichten
    6.314

    Standaard

    Zou dit kunnen voldoen?
    Zie blad2
    Bijgevoegde Bestanden Bijgevoegde Bestanden
    Mvgr. & succes, Cobbe
    ---------------------------------------------------------
    Ik hoop dat je er iets uit geleerd hebt.
    Wil je de vraag op opgelost zetten als alles werkt.

    Wil je een of ander bestand in een andere versie ontvangen?
    Laat het dan even weten, als er geen versieconflicten inzitten komt dat in orde!

  6. #5
    Geregistreerd
    Dec 2006
    Berichten
    1.940

    Standaard random getallen trekken

    Hallo allemaal,

    bedankt voor de reacties

    *snb: Ik snap je uitleg, de macro doet het ook voor 1 getal, (en nog een keer draaien voor een 2e getal) maar ik wil graag een serie ( x aantal opgegegeven) getallen in een kolom.

    *cobbe: Ik snap de oplossing, maar de verdeling van de cijfers is erg onevenwichtig.

    Groet

    Dirk

  7. #6
    Geregistreerd
    Mar 2008
    Locatie
    Bachten de kupe, W-Vl, Belgie
    Berichten
    10.260

    Standaard

    er zijn 1680 dergelijke getallen tussen 1234 en 8765.
    Er is een kans dat je 2 keer hetzelfde getal trekt.
    Code:
    Option Explicit
    
    Const Aantal = 48
    
    Sub Rand()
      Dim s As String, splits As Variant, i As Integer, j As Integer, s1 As String, Tel(1 To 8), k As Integer
      For i = 1234 To 8765                                     'onder en bovengrens
        s1 = CStr(i)
        For j = 1 To 4
          Select Case Mid(s1, j, 1)
            Case 0, 9: Exit For                                'deze zijn niet toegestaan
            Case Else: If Len(Replace(s1, Mid(s1, j, 1), "")) < Len(s1) - 1 Then Exit For  'cijfer niet meer dan 1 keer in getal
          End Select
          If j = 4 Then s = s & vbLf & s1                      'toevoegen aan verzamelstring
        Next
      Next
      splits = Split(Mid(s, 2, Len(s)), vbLf)                  'array met alle mogelijke toegestane getallen
    
      Randomize
      s = ""                                                   'verzamelstring leegmaken
      For i = 1 To Aantal                                      'aantal gewenste getallen
        j = Int(Rnd * (UBound(splits) + 1))                    'willekeurige trekking uit mogelijke getallen
        s = s & vbLf & splits(j)                               'getal toevoegen aan verzamelstring
        For k = 1 To 4: Tel(Mid(CStr(splits(j)), k, 1)) = Tel(Mid(CStr(splits(j)), k, 1)) + 1: Next  'aantal cijfers tellen
    
      Next
      splits = Split(Mid(s, 2, Len(s)), vbLf)
      Range("A1").Resize(UBound(splits)).Value = WorksheetFunction.Transpose(splits)  'je willekeurige getallen
      Range("C1").Resize(8).FormulaR1C1 = "=row()"
      Range("D1").Resize(UBound(Tel)) = WorksheetFunction.Transpose(Tel)  'telling van de cijfers
    End Sub

    versie 2 : je kan geen 2 keer hetzelfde getal trekken
    Code:
    Option Explicit
    
    Const Aantal = 48
    
    Sub Rand()
      Dim s As String, splits As Variant, i As Integer, j As Integer, s1 As String, Tel(1 To 8), k As Integer, Getallen As New Collection
      For i = 1234 To 8765                                     'onder en bovengrens
        s1 = CStr(i)
        For j = 1 To 4
          Select Case Mid(s1, j, 1)
            Case 0, 9: Exit For                                'deze zijn niet toegestaan
            Case Else: If Len(Replace(s1, Mid(s1, j, 1), "")) < Len(s1) - 1 Then Exit For  'cijfer niet meer dan 1 keer in getal
          End Select
          If j = 4 Then Getallen.Add i, s1                     'toevoegen aan verzamelstring
        Next
      Next
    
      Randomize
      s = ""                                                   'verzamelstring leegmaken
      For i = 1 To Aantal                                      'aantal gewenste getallen
        j = Int(Rnd * Getallen.Count) + 1                      'willekeurige trekking uit mogelijke getallen
        s1 = Getallen.Item(j)
        Getallen.Remove j
        s = s & vbLf & s1                                      'getal toevoegen aan verzamelstring
        For k = 1 To 4: Tel(Mid(s1, k, 1)) = Tel(Mid(s1, k, 1)) + 1: Next  'aantal cijfers tellen
    
      Next
      splits = Split(Mid(s, 2, Len(s)), vbLf)
      Range("A1").Resize(UBound(splits)).Value = WorksheetFunction.Transpose(splits)  'je willekeurige getallen
      Range("C1").Resize(8).FormulaR1C1 = "=row()"
      Range("D1").Resize(UBound(Tel)) = WorksheetFunction.Transpose(Tel)  'telling van de cijfers
    End Sub
    Laatst gewijzigd door bsalv; 07-09-12 om 01:29.
    ʎɐqǝ uo pɹɐoqʎǝʞ ɐ ʎnq ı ǝɯıʇ ʇsɐן ǝɥʇ sı sıɥʇ

  8. #7
    Geregistreerd
    Nov 2010
    Berichten
    382

    Standaard

    Zie de gele uitdraai in de bijlage
    Bijgevoegde Bestanden Bijgevoegde Bestanden

  9. #8
    Geregistreerd
    Jun 2008
    Berichten
    5.983

    Standaard

    Maar Dirk toch ....

    Code:
     
    Sub snb()
      dim sn(50)
      Randomize
     
      For j=0 to ubound(sn)
        Do
          x = Int(Rnd * 10)
          If x > 0 And InStr(sn(j), x) = 0 Then sn(j) = sn(j) & x
        Loop Until Len(sn(j)) = 4
      next
     
      cells(1).resize(ubound(sn)+1)=application.transpose(sn)
    End Sub
    Laatst gewijzigd door snb; 07-09-12 om 09:51.

  10. #9
    Geregistreerd
    Apr 2008
    Locatie
    Den Haag
    Berichten
    4.649

    Standaard

    als ik het goed begrijp....:

    nog een kleine toevoeging in snb's code:
    Code:
    ..
    If x > 0 and x < 9 And InStr(sn(j), x) = 0 Then sn(j) = sn(j) & x
    ...
    gr. Eric
    Handige Tools: Smart Indenter & MZ Tools

  11. #10
    Geregistreerd
    Jun 2008
    Berichten
    5.983

    Standaard

    @EvR
    Dat was juist voor Dirk overgelaten.....

Gelijkwaardige Onderwerpen

  1. random getallen
    Door R.Luiken in forum Afgehandelde vragen
    Reacties: 3
    Laatste Bericht: 28-04-12, 20:58
  2. Vert.zoeken / index data uit tabel trekken
    Door brandsrus in forum Afgehandelde vragen
    Reacties: 2
    Laatste Bericht: 05-12-11, 17:34
  3. formule door trekken
    Door dannyhaag in forum Afgehandelde vragen
    Reacties: 16
    Laatste Bericht: 28-07-11, 14:41
  4. winnende nummers trekken
    Door Reintje in forum Afgehandelde vragen
    Reacties: 4
    Laatste Bericht: 19-02-09, 22:15
  5. Random getallen kiezen zonder dubbele getallen
    Door Matchbox in forum Afgehandelde vragen
    Reacties: 2
    Laatste Bericht: 19-07-07, 23:00

Forum Rechten

  • Je mag geen nieuwe onderwerpen plaatsen
  • Je mag geen reacties plaatsen
  • Je mag geen bijlagen toevoegen
  • Je mag jouw berichten niet wijzigen
  •