PHP – Wahrscheinlichkeitsalgorithmus-Sortierung
过去多啦不再A梦
过去多啦不再A梦 2017-05-24 11:33:58
0
2
666

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梦
过去多啦不再A梦

Antworte allen (2)
黄舟

我觉得这个问题有问题,这样的输入甚至不能保证满足条件的分布是存在的。

{a: 60, b: 40}为例:全排列的空间是{ab, ba}。那么根据你的定义应该有:

a出现在位置0的概率为60%,所以 P(ab) = 0.6 且 b出现在位置1的概率为40%,所以 P(ab) = 0.4
    我想大声告诉你

    跟我写的一个样 = = 我也想知道怎么扩展

      Neueste Downloads
      Mehr>
      Web-Effekte
      Quellcode der Website
      Website-Materialien
      Frontend-Vorlage
      Über uns Haftungsausschluss Sitemap
      Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!