PDA

Vollständige Version anzeigen : GEWICHTETES Array?


kerim80
29.02.2008, 02:27
Hallo zusammen.

ich möchte ein gewichtetes Array aufbauen und mit einer Zufallszahl ein Element aus diesem Array rausnehmen.

in der Ausgangssituation habe ich habe folgendes Array:
i | WERT
0 | 10
1 | 25
2 | 13
3 | 8
4 | 19
5 | 13
6 | 5
7 | 8
8 | 13
9 | 13
10 | 21
11 | 14
12 | 13
13 | 23
14 | 28
15 | 21
16 | 26
17 | 9
18 | 10
19 | 16
20 | 19
21 | 5
22 | 13
23 | 21
24 | 11

aus disem Array möchte ich ein gewichtetes Array bauen.
z.B. die Position 14 hat den grössten Wert im Array und der ist = 28.
Diese Position 14 soll dann bei der Zufallsauswahl am meisten berücksichtigt werden,
danach die Position 16 mit dem Wert 26.

Wie mache ich das???
(Habe zwar ein paar Lösungansätze aber, wenn ich das hier reinposte dann liest sich das bestimmt keiner durch, weil die Seite zu lang wird.)

bst
29.02.2008, 08:19
Nochmals Hallo,

erzeuge ein Array in welchem die einzelnen Zahlen i 'Wert' Mal vorkommen.

Die Zahlen müssen in Spalte A, die Gewichtung in Spalte B direkt untereinander ab der Zeile 2. Die Gewichtungen müssen positive 'ganze Zahlen' sein.

cu, Bernd
--
Option Explicit

Sub x()
Dim ar As Variant, lngAnzahl As Long, i As Long, j As Long, k As Long

lngAnzahl = WorksheetFunction.Sum(Range("B2", Range("B2").End(xlDown)))
ar = Range("A1").CurrentRegion
ReDim arZufall(0 To lngAnzahl - 1)
For i = 2 To UBound(ar)
For j = 1 To ar(i, 2)
arZufall(k) = ar(i, 1)
k = k + 1
Next
Next
Stop ' um das Array im Lokalfenster anschauen zu können
Debug.Print arZufall(Int(Rnd() * lngAnzahl))
End Sub

IngGi
29.02.2008, 08:20
Hallo Kerim,

folgendes Makro liest deine Daten, die ich in A1 bis A25 abgelegt habe, in das Array "Daten" ein und erzeugt dann daraus das gewichtete Array "GewDaten", aus dem du deine Zufallsauswahl treffen kannst. Die Gewichtung erfolgt dabei analog zum Wert der Zahlen, d.h. die Zahl 10 ist 10 mal im Array enthalten, die Zahl 28 dagegen 28 mal usw.:
<FONT Color=Black FACE="Courier New,FixedSys" Size=2>
<Blockquote>
<FONT COLOR=#0000FF>Sub</FONT>&nbsp;test()

<FONT COLOR=#0000FF>Dim</FONT>&nbsp;Daten
<FONT COLOR=#0000FF>Dim</FONT>&nbsp;GewDaten()&nbsp;<FONT COLOR=#0000FF>As&nbsp;Integer</FONT>
<FONT COLOR=#0000FF>ReDim</FONT>&nbsp;GewDaten(0)
<FONT COLOR=#0000FF>Dim</FONT>&nbsp;intZahl&nbsp;<FONT COLOR=#0000FF>As&nbsp;Integer</FONT>
<FONT COLOR=#0000FF>Dim</FONT>&nbsp;intGewichtung&nbsp;<FONT COLOR=#0000FF>As&nbsp;Integer</FONT>

Daten&nbsp;=&nbsp;Range("A1:A25")
<FONT COLOR=#0000FF>For</FONT>&nbsp;intZahl&nbsp;=&nbsp;1&nbsp;<FONT COLOR=#0000FF>To&nbsp;UBound</FONT>(Daten,&nbsp;1)
&nbsp;&nbsp;<FONT COLOR=#0000FF>For</FONT>&nbsp;intGewichtung&nbsp;=&nbsp;0&nbsp;<FONT COLOR=#0000FF>To</FONT>&nbsp;Daten(intZahl,&nbsp;1)&nbsp;-&nbsp;1
&nbsp;&nbsp;&nbsp;&nbsp;<FONT COLOR=#0000FF>ReDim&nbsp;Preserve</FONT>&nbsp;GewDaten(<FONT COLOR=#0000FF>UBound</FONT>(GewDaten)&nbsp;+&nbsp;1)
&nbsp;&nbsp;&nbsp;&nbsp;GewDaten(intGewichtung)&nbsp;=&nbsp;Daten(intZahl,&nbsp;1)
&nbsp;&nbsp;<FONT COLOR=#0000FF>Next</FONT>&nbsp;<FONT COLOR=#008000>'intGewichtung</FONT>
<FONT COLOR=#0000FF>Next</FONT>&nbsp;<FONT COLOR=#008000>'intZahl</FONT>
<FONT COLOR=#0000FF>ReDim&nbsp;Preserve</FONT>&nbsp;GewDaten(<FONT COLOR=#0000FF>UBound</FONT>(GewDaten)&nbsp;-&nbsp;1)

<FONT COLOR=#0000FF>End&nbsp;Sub</FONT>

<FONT Size=2>
<p>Code eingefügt mit <b><a href="http://rtsoftwaredevelopment.de" target="_blank">Syntaxhighlighter 4.14</a></b></FONT></p>
</Blockquote><FONT FACE="Arial,FixedSys"Size=3>Gruß Ingolf