Schnellster Weg, um ein Array zufällig zu mischen, basierend auf den Wahrscheinlichkeiten in PHP?

Post a reply

Smilies
:) :( :oops: :chelo: :roll: :wink: :muza: :sorry: :angel: :read: *x) :clever:
View more smilies

BBCode is ON
[img] is ON
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: Schnellster Weg, um ein Array zufällig zu mischen, basierend auf den Wahrscheinlichkeiten in PHP?

by Anonymous » 08 Mar 2025, 13:37

Ich habe ein Array mit Werten und Wahrscheinlichkeiten (oder in PHP, Tasten und Werten): < /p>

Code: Select all

Value   Probability
John    3
Peter   2
Paul    1
< /code>
Ich möchte dieses Array mischen, aber die Reihenfolge von der Wahrscheinlichkeit beeinflusst werden. Das heißt, im Durchschnitt sollte John in der Hälfte der Zeit ganz oben auf der Liste erscheinen, Peter in einer dritten Zeit und Paul ein sechstem der Zeit usw.* Die durchschnittliche Reihenfolge über Tausende von Mischungen sollte der oben angegeben sein.John
John
John
Peter
Peter
Paul
< /code>
< /li>
  Verschüttet dieses Array, z. B.:
John
Paul
Peter
John
John
Peter
< /code>
< /li>
  Entfernen Sie die Duplikate und lassen Sie die erste Instanz: < /p>
John
Paul
Peter
< /code>
< /li>
< /ol>
In PHP -Code könnte dies in etwa so aussehen: < /p>
$items = array(
'John' => 3,
'Peter' => 2,
'Paul' => 1
);

$probabilities = array();
foreach($items as $item => $value){
$interim = array_fill(1, $value, $item);
$probabilities = array_merge($probabilities, $interim);
}

shuffle($probabilities);

$result = array_unique($probabilities);

print("".print_r($result,true)."");
< /code>
 Gibt es eine schnellere Möglichkeit, dies zu tun? />Person P1  P2  P3
John   3/6 2/6 1/6
Peter  2/6 2/6 2/6
Paul   1/6 2/6 3/6
< /code>
Beachten Sie, dass die Wahrscheinlichkeiten für den zweiten und dritten Rang aus der Wahrscheinlichkeit für den ersten Rang folgen und in den ursprünglichen Daten nicht explizit angegeben sind. Sie werden hier nur zu Ihrer Bequemlichkeit präsentiert, weil jemand in den Kommentaren unten gefragt wurde.John 3  ← line 1
Peter 2
Paul 1
Simon 6
Robert 2
William 1
...
Sean 1  ← line 786

Top