Ich habe ein 1D-Array von ganzen Zahlen mit einem Wert ungleich Null bei einigen Indizes, der Rest ist Null. Der Wert ungleich Null ist gleich dem Index. Z.B:
CHOOSEARRAY = (/0,0,0,4,0,6,7/)
Ich möchte zufällig ein beliebiges Element ungleich Null aus diesem Array auswählen. In diesem Fall möchte ich, dass die Ausgabe mit gleicher Wahrscheinlichkeit entweder 4,6 oder 7 beträgt.
Mein derzeitiger Ansatz ist etwas verworren und funktioniert wie folgt:
Zählen Sie die Anzahl der verfügbaren Auswahlmöglichkeiten
NCHOICE = COUNT(CHOOSEARRAY.NE.0)
Erstellen Sie ein Array und füllen Sie es mit den Werten ungleich Null
ALLOCATE(CHOICES(NCHOICE))
CHOICES = PACK(CHOOSEARRAY,CHOOSEARRAY.NE.0)
Wähle ein zufälliges Element aus diesem neuen Array
CHOSENVAL = CHOICES(FLOOR(1+GRND()*NCHOICE))
GRND() ist hier eine Zufallszahlenerzeugungsfunktion, die eine reelle Zahl gleichmäßig zwischen 0 und 1 verteilt ausgibt.
Dieser Codeblock muss mehrmals wiederholt werden, was mehrere Zuweisungs- und Aufhebungsoperationen erfordert, die zeitaufwändig sein können. Gibt es einen besseren Weg, dieses Problem anzugehen?
Gibt es alternativ eine Möglichkeit, den Index eines zufällig ausgewählten Elements ungleich Null zurückzugeben? Zum Beispiel sollte (/0,1,1,0,0,1/) mit gleicher Wahrscheinlichkeit entweder 2,3 oder 6 ergeben.
Wenn Sie keine Angst vor ein paar Divisionen durch Null haben, könnte dies ansprechen. Lassen Sie uns zuerst einige Zufallszahlen haben ...
REAL, DIMENSION(SIZE(choosearray)) :: rands
CALL RANDOM_NUMBER(rands)
dann können wir die Position eines zufälligen Elements ungleich Null choosearray
mit dem Ausdruck
MAXLOC(rands * choosearray/choosearray)
und erhalte dann seinen Wert mit
choosearray(MAXLOC(rands * choosearray/choosearray))
Ich überlasse es Ihnen, die Geschwindigkeit zu testen.
Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.
Bei Verstößen wenden Sie sich bitte [email protected] Löschen.
Lass mich ein paar Worte sagen