Seite 4 von 4

Verfasst: 05.10.2006 13:40
von Karl
Nein, ich meine es so:

Gut, Array passt nicht wirklich so richtig, besser ist wohl "Bereich". Also denke dir eine Stichprobe von sagen wir 500.

Je nachdem wie die Buchstaben verteilt sind (z. B. 30x N, 20x E etc.) legst du jetzt (gedanklich) einen Bereich an, z. B. für A:-> index von 0 bis 5 etc.

Dann die Zufallszahl bestimmen und prüfen, innerhalb welches Bereiches sie sich befindet, das wäre dann der Buchstabe unter Berücksichtigung der Verteilung. Geht deswegen, weil Random() gleichverteilt ist und demnach die Anordnung der Buchstaben keine Rolle spielt.

Gruß Karl

Verfasst: 05.10.2006 13:43
von remi_meier

Code: Alles auswählen

Procedure InitRandom(Vert.l(1))
  Shared _Sum.l
  For z = 0 To PeekL(@Vert() - 8) - 1
    _Sum + Vert(z)
  Next
EndProcedure

Procedure.l VertRandom(Vert.l(1))
  Shared _Sum
  Protected Rand.l, Index.l
  Rand = Random(_Sum - 1) + 1
  
  Index = 0
  
  If Rand
    While Rand > 0
      Rand - Vert(Index)
      Index + 1
    Wend
    
    Index - 1
  Else
    Index = 0
  EndIf
  
  ProcedureReturn Index
EndProcedure




DataSection
verteilung:
Data.l 2, 5, 10, 4, 1
EndDataSection
Dim Vert.l(4)
CopyMemory(?verteilung, @Vert(), 5 * SizeOf(Long))

InitRandom(Vert())
Dim res.l(4)
For z = 0 To 1000
  a = VertRandom(Vert())
  res(a) + 1
Next

Debug res(0)
Debug res(1)
Debug res(2)
Debug res(3)
Debug res(4)
und PB Bug, wenn man
res(VertRandom(Vert())) + 1
schreibt :freak:

Verfasst: 05.10.2006 13:46
von Kaeru Gaman
@Karl

ah, jetzt verstehe ich, cool. :allright:

es wäre zwar immer noch eine tabelle, die man mitliefern müsste,
aber dafür ein verfahren, das auf jede beliebige diskrete verteilung
anwendbar ist, und keine formel, die immer wieder neu gebacken
werden müsste.

Verfasst: 17.10.2006 14:02
von zweiger
Ausgezeichnete Lösung!