Avatar billede jernrosen3 Professor
03. maj 2011 - 11:05 Der er 7 kommentarer og
1 løsning

Lave en tilfældig orden af præmier

Jeg har en liste over antal af lotteripræmier i engelsk excel 2007 - den ser således :

A                  B
"Præmienavn"      "Antal"
Skuffedarium      2
Dippedut          10
Himstregims        2
.........          200
.......            500

Kan jeg få hjælp til at lave en tilfældigheds-genereret (RAND)liste over præmier, så præmier bliver ligeligt ( men stadig tilfældigt ) fordelt udfra nogenlunde disse kritierer :

Samlet antal lodder til salg skal kunne skaleres til mellem 13.000 og 17.000 ( tallet varierer afhængigt af antal præmier ) - vi regner med ca 10% lodder med gevinst.

Der skal helst være ca. lige mange lige og ulige lodder med gevinst - dette er ikke et ultimativt krav da (RAND) jo tilfældigt vælger.

Altså : En formel/VBA-action der tager antal navngivne gevinster og fordeler dem jævnt/tilfældigt i et nyt ark
Avatar billede Tryphon Nybegynder
03. maj 2011 - 11:58 #1
En formel kunne se sådan ud:

=RANDBETWEEN(1,13000) - kopier formlen det antal celler ned, som du ønsker numre. Vær opmærksom på, at du vil have et problem med dubletter

I VBA kunne koden se sådan ud:

Option Explicit

Function GetNos()
Dim NO As Integer
Dim AntalNos As Integer
  AntalNos = 100
Dim nos() As Integer
  ReDim nos(1 To AntalNos, 1 To 1) As Integer
Dim x As Integer
Dim InsR As Integer
Dim MaxNo As Integer
  MaxNo = 13000

  InsR = LBound(nos, 1)
 
  Do While True
    ' Trækker et tilfældigt nummer
    Randomize
    NO = Int(MaxNo * Rnd)
    For x = LBound(nos, 1) To InsR Step 1
      ' Tjekker for dubletter
      If InsR > 1 Then
        If NO = nos(InsR - 1, 1) Then
          GoTo NextNumber
        End If
      End If
      nos(InsR, 1) = NO
      InsR = InsR + 1
     
      ' Escape sekvens
      If InsR = UBound(nos, 1) + 1 Then
        Exit Do
      End If
    Next x
NextNumber:
  Loop
  Range(Cells(LBound(nos, 1), 1), Cells(UBound(nos, 1), 1)) = nos()
End Function

Koden tager ikke hensyn til fordelingen på lige og ulige numre.

Sig til, hvis du kan bruge det. Så poster jeg et svar.
Avatar billede jernrosen3 Professor
03. maj 2011 - 15:16 #2
Jeg har prøvet begge løsninger; men begge laver dubletter.

Det er lidt tilfældigt med RANDBETVEEN

- til gengæld har din VBA-kode lavet numrene i grupper á 5 af de samme numre - konsekvent gennem alle kørsler.

Jeg har prøvet som den er - den trækker 100 numre uden problem.
Når jeg ændrer AntalNos til 1300 ser den størrelses-sorterede liste således ud :

19
19
19
19
19
51
51
51
51
51  .... osv

Bruger jeg det forkert ? eller ?
Avatar billede Tryphon Nybegynder
03. maj 2011 - 16:42 #3
En mindre bug :-)

Prøv med nedenstående. Jeg har kørt den 100 gange, og der ser ikke ud til at være dubletter. Jeg har også rettet den til, så den ikke kan komme med værdien nul.

Function GetNos()
Dim NO As Integer
Dim AntalNos As Integer
  AntalNos = 1300
Dim nos() As Integer
  ReDim nos(1 To AntalNos, 1 To 1) As Integer
Dim x As Integer
Dim InsR As Integer
Dim MaxNo As Integer
  MaxNo = 13000

  InsR = LBound(nos, 1)
 
  Do While True
    ' Trækker et tilfældigt nummer
    Randomize
    NO = Int(MaxNo * Rnd + 0.5)
    ' Hvis NO = 0
    If NO = 0 Then
      GoTo NextNumber
    End If
    For x = LBound(nos, 1) To InsR Step 1
      ' Tjekker for dubletter
      If InsR > 1 Then
        If NO = nos(x, 1) Then
          GoTo NextNumber
        End If
      End If
    Next x
   
    nos(InsR, 1) = NO
    InsR = InsR + 1
   
    ' Escape sekvens
    If InsR = UBound(nos, 1) + 1 Then
      Exit Do
    End If
NextNumber:
  Loop
  With Range(Cells(LBound(nos, 1), 1), Cells(UBound(nos, 1), 1))
    .Value = nos()
    .Sort Range("a1"), xlAscending, , , , , , xlNo
  End With
End Function
Avatar billede jernrosen3 Professor
03. maj 2011 - 21:48 #4
Det var lige det jeg manglede til at lave tilfældige tal.

Tak for det !

Så mangler jeg bare en formel/kode der kan sætte/kopiere vore præmier ind i B-rækken tilfældigt. Jeg er klar over at jeg kan kopiere "Duppedit" 200 gange etc etc inden sortering i rækkerne men helt ærligt - det er jeg altså lidt for doven til *S*
Avatar billede Tryphon Nybegynder
04. maj 2011 - 08:17 #5
Vær i øvrigt lige opmærksom på, om den trækker det højeste tal i dit interval med ud (13000). Kom lige til at tænke på, at det muligvis kunne være et problem.

Du kan principielt bruge samme kode til at generere din præmieliste, hvis du nummererer præmierne, men hvis du ud af 1300 tal skal vælge alle 1300 i tilfældig orden, vil du opleve, at koden bliver ekstremt langsom. Selvom du er doven, vil det nemmeste være, at kopiere "Duppedit" 200 gange inden sortering - eller lave en lille kode, der laver kopieringen for dig :-).

F.eks.

Dim startrække as long
dim antal as integer

startrække = 1
antal = 200

For x = startrække to startrække + antal step 1
cells(x,2) = "Duppedit"
next x

Den er ikke testet, men det kan du jo selv sidde og rode lidt med. :-)
Avatar billede jernrosen3 Professor
04. maj 2011 - 08:39 #6
Kunne din kode

antal = ActiveCell ( øhh ? )  +1 til højre  .... tror nok den hedder (0 , 1) ?
 
cells(x,2)="Duppedit" evt. referere til en celle ?

F.eks cells(x,2)=ActiveCell

Altså så den skriver indhold af aktiv celle - antal det der atår til højre herfor ?
Avatar billede jernrosen3 Professor
04. maj 2011 - 08:39 #7
atår = står *S*
Avatar billede jernrosen3 Professor
04. maj 2011 - 08:41 #8
Under alle omstændigheder - MANGE TAK for hjælp
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
Excel kurser for alle niveauer og behov – find det kursus, der passer til dig

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

IT-JOB