Wie sortiere ich Daten nach Wahrscheinlichkeit, sodass jedes Wahrscheinlichkeitsintervall ein Ergebnis hat?
Angenommen, es gibt einen Datensatz wie folgt
{
a: 40,
b: 20,
c: 10,
d: 5,
e: 5,
f: 5,
g: 5,
h: 5,
i: 3,
j: 2
}
Schlüssel ist der zu sortierende Wert und Wert ist die Wahrscheinlichkeit, dass jeder Wert an dieser Position im Array erscheint. Beispielsweise hat a eine 40-prozentige Wahrscheinlichkeit, an Position 0 im Array zu erscheinen , a hat eine Chance von 40 %, zuerst im Array angezeigt zu werden, und der Rest wird algorithmisch nach Wahrscheinlichkeit sortiert.
Meine aktuelle Lösung (Lows Methode, und sie kann nicht weiter unterstützt werden, wenn das Array erweitert wird):
1. Teilen Sie das Intervall entsprechend der vorhandenen Wahrscheinlichkeit, vorausgesetzt, dass das Intervall von a 0-40 und das Intervall von b beträgt 40-60, c ist 60-70 und so weiter
2 Verwenden Sie die Funktion, um eine Zufallszahl im Bereich von 1-100 zu erhalten, und werfen Sie dann das Ergebnis (dh geben Sie es in das entsprechende Intervall ein)
Der Code lautet wie folgt (Suche nach Optimierungsideen)
public function getRandValue($rate, $max, $min, $arr)
{
while (count($rate)) {
$rand = $this->getRand($min, $max);
if (0 < $rand && $rand <= 40) {
$num = 40;
} else if (40 < $rand && $rand <= 60) {
$num = 20;
} else if (60 < $rand && $rand <= 70) {
$num = 10;
} else if (70 < $rand && $rand <= 75) {
$num = 5;
} else if (75 < $rand && $rand <= 80) {
$num = 5;
} else if (80 < $rand && $rand <= 85) {
$num = 5;
} else if (85 < $rand && $rand <= 90) {
$num = 5;
} else if (90 < $rand && $rand <= 95) {
$num = 5;
} else if (95 < $rand && $rand <= 98) {
$num = 3;
} else if (98 < $rand && $rand <= 100) {
$num = 2;
}
if (!in_array($num, $arr) && in_array($num, array(40, 20, 10, 3, 2))) {
$arr[] = $num;
} elseif (!in_array($num, array(40, 20, 10, 3, 2))) {
$arr[] = $num;
}
if (count($arr) >= 10) {
break;
}
}
return $arr;
}
Aufgetretene Probleme: (in_array-Beurteilung liegt daran, dass die Werte dieser Intervalle nur einmal berechnet werden können)
1 Der berechnete Wert muss nicht unbedingt den Wert jedes Intervalls haben
2 Der Code ist nicht skalierbar
Ich hoffe auch, dass Sie mir einige Ratschläge und Ratschläge geben können, vielen Dank an alle!
我觉得这个问题有问题,这样的输入甚至不能保证满足条件的分布是存在的。
以
{a: 60, b: 40}
为例:全排列的空间是{ab, ba}
。那么根据你的定义应该有:跟我写的一个样 = = 我也想知道怎么扩展