[php/MySQL] Tirage au sort avec pondération

Consultez la formation au référencement naturel Google de WebRankInfo / Ranking Metrics


moktoipas
WRInaute accro
WRInaute accro
 
Messages: 2323
Inscription: Mar Juin 29, 2004 11:52

Message le Mer Déc 12, 2007 22:32

ben le mysql c une ecriture disque...le table php c'est une ecriture ram, c'est pas du tout pareil en terme de perfs !
(et en cas de modification de force, j'ai qu'ne ligne a changer)

lui il change souvent les force des hamster soit dit en passant (en fonction de l'activité des hamsters sur le site (a) )
donc je pense que c'est mieux.

mais effectivement pour un cas ou on change pas souvent la force des hamsters, c'est mieux de plus utiliser mysql :)

il faudrai qu'il s'ammuse a faire des tests de perfs :D :D


rog
WRInaute accro
WRInaute accro
 
Messages: 1662
Inscription: Jeu Sep 21, 2006 2:32

Message le Jeu Déc 13, 2007 0:09

bizarre

je dois être le seul à penser que c'est nimporte quoi

lol

rog


moktoipas
WRInaute accro
WRInaute accro
 
Messages: 2323
Inscription: Mar Juin 29, 2004 11:52

Message le Jeu Déc 13, 2007 0:11

lol je t'assure que ca marche :)


rog
WRInaute accro
WRInaute accro
 
Messages: 1662
Inscription: Jeu Sep 21, 2006 2:32

Message le Jeu Déc 13, 2007 0:21

1 - 500
2 - 1000
3 - 2000

= 3500

si on divise par 500, on obient 7
sur 7 affichages on devrait avoir
une fois le 1
deux fois le 2
quatre fois le 3

on pourrait facilement coder un proof of concept :
tu rajoutes un champs ou tu incremente les selections et tu lances une boucle de 70, si tu obtiens

1 - 500 [10]
2 - 1000 [20]
3 - 2000 [40]

tu obtiendras aussi mon respect et toutes mes excuses

rog


moktoipas
WRInaute accro
WRInaute accro
 
Messages: 2323
Inscription: Mar Juin 29, 2004 11:52

Message le Jeu Déc 13, 2007 0:35

[LIEN MORT]



Code: Tout sélectionner
$hamster[0]=500;
$hamster[1]=1000;
$hamster[2]=2000;

function poc($hamster)
{
   $forcetotaledeshamster=3500;
   $monrandom=rand  (0,$forcetotaledeshamster);
   $a=0;
   $trouve=false;
   while (!$trouve)
   {
      $monrandom-=$hamster[$a];
      if ($monrandom<=0)
      {
         $trouve=true;
         $result=$a;
      }
      $a++;
   }
   return $result;
}

$result[0]=0;
$result[1]=0;
$result[2]=0;
for ($aa=0;$aa<700;$aa++)
{
   $result[poc($hamster)]++;
}


foreach ($result as $in=>$val)
{
   echo $in." - ".$hamster[$in]." [".$val."]<br>";
}
Dernière édition par moktoipas le Mer Sep 03, 2008 23:08, édité 1 fois.


rog
WRInaute accro
WRInaute accro
 
Messages: 1662
Inscription: Jeu Sep 21, 2006 2:32

Message le Jeu Déc 13, 2007 1:13

lol

je n'ai d'autre choix que de m'incliner, bravo et j'en profite pour m'excuser

j'avais pas vu la proportionnalité dans l'equation

tu fais comment si il y a deux hamster de même force ?

rog


moktoipas
WRInaute accro
WRInaute accro
 
Messages: 2323
Inscription: Mar Juin 29, 2004 11:52

Message le Jeu Déc 13, 2007 1:16

bah rien de spécial, je change la force du hamster, ca change la somme des force et l'algo change les proportions tout seul


rog
WRInaute accro
WRInaute accro
 
Messages: 1662
Inscription: Jeu Sep 21, 2006 2:32

Message le Jeu Déc 13, 2007 1:47

ça marche plutôt bien, je n'ai pas pu m'empêcher de le rogiser
:D

Code: Tout sélectionner
error_reporting(E_ALL);
#
$hamster[0]=500;
$hamster[1]=1000;
$hamster[2]=2000;
$hamster[3]=2000;
$hamster[4]=500;

define('FORCE_HAMSTER',array_sum($hamster));
#
function poc($hamster){
#
$monrandom = rand(0,FORCE_HAMSTER);
$a = 0;
$trouve = false;
#
while(!$trouve)
      {
    $monrandom -= $hamster[$a];
   #
    if ($monrandom <= 0)
       {
        $trouve = true;
        $result = $a;
         }
   $a++;
   }
return $result;
}
#
$result = array();
#
for($i = 0; $i < count($hamster); $i++)
   {
   $result[$i] = 0;
   }
#
for ($a = 0; $a < 800; $a++)
   {
   $result[poc($hamster)]++;
   }
#
foreach ($result as $in=>$val)
   {
      echo $in." - ".$hamster[$in]." [".$val."]<br>";
   }


rog


moktoipas
WRInaute accro
WRInaute accro
 
Messages: 2323
Inscription: Mar Juin 29, 2004 11:52

Message le Jeu Déc 13, 2007 11:03

ATTENTION

J'ai remarqu" que j'avias fait une erreur dans mon script, il y a un leger biais en faveur du premier hamster.

mon random devrai commencer à 1, pas 0.


rog
WRInaute accro
WRInaute accro
 
Messages: 1662
Inscription: Jeu Sep 21, 2006 2:32

Message le Jeu Déc 13, 2007 13:26

oups

comme ça au reveil c'est un peu agressif :D

ce qui me gênait dans ce concept c'est la totale dependance de la pertinence de la fonction rand(), le poc est très bien mais le comportement de la fonction à l'interieur d'une boucle n'est pas forcement le même que lorsqu'elle est lancée à intervalles irréguliers

j'ai donc fait un poc qui randomise les intervalles

Code: Tout sélectionner
error_reporting(E_ALL);
#
$sleep = rand(1,3);
sleep($sleep);
#
session_start();
#
if(!isset($_SESSION['loop']))
   {
   $_SESSION['hamster'][0] = 500;
   $_SESSION['hamster'][1] = 1000;
   $_SESSION['hamster'][2] = 2000;
   $_SESSION['hamster'][3] = 2000;
   $_SESSION['hamster'][4] = 500;
   #
   $_SESSION['result'][0] = 0;
   $_SESSION['result'][1] = 0;
   $_SESSION['result'][2] = 0;
   $_SESSION['result'][3] = 0;
   $_SESSION['result'][4] = 0;
   #
   $_SESSION['FORCE_HAMSTER'] = array_sum($_SESSION['hamster']);
   $_SESSION['loop'] = 0;
   }
#
$_SESSION['loop']++;
#
$_SESSION['result'][poc()]++;
#
$display = "<li> boucle n° : ".$_SESSION['loop'];
#
foreach ($_SESSION['result'] as $in=>$val)
   {
      $display .= "<br> hamster n° : ".($in + 1)." - force : ".$_SESSION['hamster'][$in]." cumul des requêtes : {$val} - derivation : ".pertinence($in)."<br>";
   }
#
if($_SESSION['loop'] < 6000)
   {
   $display .= ("<SCRIPT LANGUAGE=\"JavaScript\"> document.location.href=\"".$_SERVER['PHP_SELF']."\"</script>");
   }
echo($display);
flush();
#
#   counter reset
#session_destroy();
#
##############################################################################################################
function poc(){
##############################################################################################################
$monrandom = rand(1,$_SESSION['FORCE_HAMSTER']);
$a = 0;
$trouve = false;
#
while(!$trouve)
      {
    $monrandom -= $_SESSION['hamster'][$a];
   #
    if ($monrandom <= 0)
       {
        $trouve = true;
        $result = $a;
         }
   $a++;
   }
return $result;
}
##############################################################################################################
function pertinence($index){
##############################################################################################################
#
$coef = $_SESSION['FORCE_HAMSTER'] / $_SESSION['loop'];
# cumul hamster réaligné
$realign = $_SESSION['result'][$index] * $coef;
#
$pertinence = round($realign / $_SESSION['hamster'][$index],2);
#
return $pertinence;
}
##############################################################################################################


la derivation de pertinence n'excede pas 20%

edit : a 1000 la derivation descend au dessous de 10%
re edit : resultat sur 6000 requêtes

boucle n° : 6000

hamster n° : 1 - force : 500 cumul des requêtes : 488 - derivation : 0.98
hamster n° : 2 - force : 1000 cumul des requêtes : 1003 - derivation : 1
hamster n° : 3 - force : 2000 cumul des requêtes : 1978 - derivation : 0.99
hamster n° : 4 - force : 2000 cumul des requêtes : 2057 - derivation : 1.03
hamster n° : 5 - force : 500 cumul des requêtes : 474 - derivation : 0.95


pour obtenir une derivation de pertinence de 0 on devra tenir compte d'une statistique de selection dans l'algo

rog[/quote]

[php/MySQL] Tirage au sort avec pondération

Formation recommandée sur ce thème :

Formation Référencement naturel Google : apprenez une méthode efficace pour optimiser à fond le référencement naturel dans Google de façon durable... Formation animée par Olivier Duffez et Fabien Facériès, experts en référencement naturel.

Tous les détails sur le site Ranking Metrics : programme, prix, dates et lieux, inscription en ligne.

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités