Maison  >  Questions et réponses  >  le corps du texte

php - tri par algorithme probabiliste

Comment trier les données selon la probabilité pour que chaque intervalle de probabilité ait un résultat ?

Par exemple, supposons qu'il existe un ensemble de données comme suit

{
a: 40,
b: 20,
c: 10,
d: 5,
e: 5,
f: 5,
g: 5,
h: 5,
i: 3,
j: 2
}

Key est la valeur à trier et value est la probabilité que chaque valeur apparaisse à cette position dans le tableau. Par exemple, a a une probabilité de 40 % d'apparaître à la position 0 dans le tableau. , a a 40 % de chances d'être affiché en premier dans le tableau, puis le reste est trié algorithmiquement en fonction de la probabilité.

Ma solution actuelle (méthode de Low, et elle ne peut pas continuer à être prise en charge à mesure que le tableau se développe) :
1. Divisez l'intervalle en fonction de la probabilité existante, en supposant que l'intervalle de a est de 0 à 40 et que l'intervalle de b est de 0 à 40. 40-60, c est 60-70, et ainsi de suite
2. Utilisez la fonction pour obtenir un nombre aléatoire compris entre 1 et 100, puis lancez le résultat (c'est-à-dire, placez-le dans l'intervalle correspondant)

.

Le code est le suivant (à la recherche d'idées d'optimisation)

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;
    }

Problèmes rencontrés : (le jugement in_array est dû au fait que les valeurs​​de ces intervalles ne peuvent être calculées qu'une seule fois)
1 La valeur calculée n'a pas nécessairement la valeur de chaque intervalle
2 Le code n'est pas évolutif

.

J'espère aussi que vous pourrez me donner quelques conseils et astuces, merci à tous !

过去多啦不再A梦过去多啦不再A梦2722 Il y a quelques jours732

répondre à tous(2)je répondrai

  • 黄舟

    黄舟2017-05-24 11:35:58

    Je pense qu'il y a un problème avec cette question. Une telle contribution ne garantit même pas qu'une distribution satisfaisant aux conditions existe.

    Avec {a: 60, b: 40} 为例:全排列的空间是{ab, ba}. Alors selon votre définition, cela devrait être :

    a出现在位置0的概率为60%,所以 P(ab) = 0.6
    
    且
    
    b出现在位置1的概率为40%,所以 P(ab) = 0.4

    répondre
    0
  • 我想大声告诉你

    我想大声告诉你2017-05-24 11:35:58

    Tout comme ce que j'ai écrit == Je veux aussi savoir comment développer

    répondre
    0
  • Annulerrépondre