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 valeursde 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 !
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 :Tout comme ce que j'ai écrit == Je veux aussi savoir comment développer