Précédent   Forum des professionnels en informatique > PHP > Langage > Fonctions
Fonctions Forum d'entraide sur les fonctions PHP. Avant de poster -> FAQ fonctions et Sources diverses
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 17/12/2011, 17h03   #1
Futur Membre du Club
 
Homme
Assistant Maitrise d'Ouvrage
Inscription : novembre 2004
Messages : 34
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 32
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Assistant Maitrise d'Ouvrage
Secteur : Industrie

Informations forums :
Inscription : novembre 2004
Messages : 34
Points : 15
Points : 15
Par défaut Influencer un nombre aléatoire (le retour)

Bonjour à tous,

Je poste ici un sujet que j'ai déjà posté et pour lequel j'ai eu une réponse satisfaisante...... mais c'était dans le cadre d'un autre langage : Python.

Donc voici mot pour mot ce que j'avais posté :
Citation:
Bonjour à tous,

Je débute en Python... Jusqu'ici j'ai réussi à me débrouiller mais là, je bute sur un petit problème.
Mon soucis serait peut-être plus proche d'un problème de math que du Python mais bon... peut-être que Python a une solution miracle.

Voilà, j'essaye juste de générer des nombres aléatoires entre 0 et 100... mais je voudrais qu'il y ait plus de probabilité qu'il soit proche de 100 que de 0.

Si quelqu'un peut calmer ma migraine, je lui en serais reconnaissant.

A+
Memento
Discussion complète ici :
http://www.developpez.net/forums/d11...bre-aleatoire/

Et la réponse que j'avais retenu et qui me convenait était d'utiliser la fonction random.betavariate(alpha, beta).

Très bien. Python avait effectivement une solution miracle. Mais maintenant, j'ai un peu la même problématique en PHP. Existe-t-il une fonction équivalente ? Ou sinon auriez vous une autre solution miracle ?

A préciser peut-être : on m'a souligné qu'il valait mieux parler de "Loi/Distribution/Repartition non uniforme" (si je ne me trompe, c'est la distribution Beta que j'avais retenu).

Enfin... je suis loin d'être un matheux.

Merci pour votre aide.
A+
memento80 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2011, 10h51   #2
Membre régulier
 
Inscription : février 2007
Messages : 114
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 114
Points : 74
Points : 74
Salut !
Pas vraiment de réponse à apporter mais le sujet m'intéresse fortement pour un projet que je vais bientôt commencer... Je m'associe donc à ta recherche.

Sauf erreur, il n'existe pas de fonction PHP dédiée à cet usage. Mais comme tu le disais, je pense que le problème peut être résolu mathématiquement... Mais je ne suis pas très fortiche en math... Je vais essayer de réfléchir à ça quand même...

Si tu trouves quelque chose entre temps, tiens moi au courant !
manu_71 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2011, 11h56   #3
Modératrice
 
Avatar de Celira
 
Femme
Développeuse PHP/Java
Inscription : avril 2007
Messages : 3 671
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 27
Localisation : France

Informations professionnelles :
Activité : Développeuse PHP/Java

Informations forums :
Inscription : avril 2007
Messages : 3 671
Points : 5 404
Points : 5 404
A priori, il existe quelque de chose de semblable : stats_rand_gen_beta
Bon évidemment, ce n'est pas une fonction native de php : il faut installer l'extension PECL de statistiques
(et là s'arrête ma science, les statistiques faisant partie de ces choses que j'ai oublié dans les 3 minutes après la fin du partiel correspondant )
__________________
Modératrice PHP
Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)

Pour afficher votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur)
Celira est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 19/12/2011, 16h33   #4
Membre régulier
 
Inscription : février 2007
Messages : 114
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 114
Points : 74
Points : 74
Ouaip, c'est une bonne piste tout de même.
Je manque de temps pour creuser ça maintenant mais si j'arrive à me dégager 5 minutes, je repasse par là en dire plus.
manu_71 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2011, 17h17   #5
Membre confirmé
 
Avatar de Pymento
 
Homme
Ingé. Info.
Inscription : janvier 2008
Messages : 339
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 24
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingé. Info.

Informations forums :
Inscription : janvier 2008
Messages : 339
Points : 273
Points : 273
Salut,
je n'ai pas cherché mais si jamais tu ne trouve pas de lib pour faire ça, tu pourrais faire un algo bien sale du genre :


Un nombre aléatoire entre 0 & 100

puis un nombre aléatoire entre 30 & 60

tu génère ton premier nombre et si avec l'ajout du second généré tu ne dépasse pas cent tu l'ajoute. Tu peux faire le test N fois .

Et donc tu auras plus de chance de tomber sur un nombre vers 100 !
__________________
Memento Quia Pulvis Es, Et In Pulverem ReverteriS
Pymento est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2011, 17h19   #6
Futur Membre du Club
 
Homme
Assistant Maitrise d'Ouvrage
Inscription : novembre 2004
Messages : 34
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 32
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Assistant Maitrise d'Ouvrage
Secteur : Industrie

Informations forums :
Inscription : novembre 2004
Messages : 34
Points : 15
Points : 15
Oui, c'est la première réaction que j'ai eu : "c'est une très bonne piste !".
Merci Celira.

Après, quand j'ai vu qu'il fallait installer un truc (extension PECL, hein ? kesaco ?) et en jetant un oeil (vite-fait car j'ai pas trop le temps au boulot) sur comment ça s'installait, l'enthousiasme est vite retombé. J'ai l'impression que c'est une belle nébuleuse ça aussi pour un débutant comme moi, non ?

Si vous avez quelques pistes ou manu_71 si tu avances plus vite que moi, ça m'intéresse...

Sinon, j'essaierai de creuser cette piste ce soir ou demain soir si je peux, et vous tiendrai au courant.
memento80 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2011, 17h21   #7
Membre confirmé
 
Avatar de Pymento
 
Homme
Ingé. Info.
Inscription : janvier 2008
Messages : 339
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 24
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingé. Info.

Informations forums :
Inscription : janvier 2008
Messages : 339
Points : 273
Points : 273
Ha ok, je parle dans le vide donc ^^
__________________
Memento Quia Pulvis Es, Et In Pulverem ReverteriS
Pymento est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 19/12/2011, 19h35   #8
Futur Membre du Club
 
Homme
Assistant Maitrise d'Ouvrage
Inscription : novembre 2004
Messages : 34
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 32
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Assistant Maitrise d'Ouvrage
Secteur : Industrie

Informations forums :
Inscription : novembre 2004
Messages : 34
Points : 15
Points : 15
Non Pymento, tu ne parles pas dans le vide... C'est juste que j'ai posté presque en même temps que toi et je n'ai vu ta réponse qu'après.

Merci pour ton idée. C'est une solution de contournement effectivement (et au moins, on se casse pas la tête avec des beta/alpha/Loi/Distribution que très peu connaissent ou se souviennent...).

Par contre, avec ta solution on ne pourra jamais obtenir entre 0 et 29 donc. Moi, j'aimerais bien quand même.... et même si c'est une fois sur 1 million.
Et puis statistiquement parlant, le nombre de fois d'obtenir 100 ne serait pas forcément supérieur que celui d'obtenir 99 ou 98 ou....
Tatillon ? Noooon...
memento80 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2011, 21h15   #9
Membre confirmé
 
Homme Clément
Développeur informatique
Inscription : décembre 2006
Messages : 213
Détails du profil
Informations personnelles :
Nom : Homme Clément
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : décembre 2006
Messages : 213
Points : 277
Points : 277
Moi non plus, pas expert en maths, mais j'ai encore des restes... Voilà un bout de code et des explications un peu... bref.

Je me suis dit qu'on pourrait simuler ça avec une loi normale. La loi normale a deux paramètres
mu : valeur centrale, autour de laquelle la valeur que l'on va générer aura le plus de chance de se retrouver (=espérance).
sigma : la dispersion des valeurs (=ecart-type). Plus sigma est petit, plus les valeurs seront souvent proche de mu. Plus sigma est grand, plus les valeurs auront tendance à être loin de mu.

Il existe un algorithme qui permet de générer des nombres aléatoire suivant cette loi, l'algorithme de Box-Muller (merci wikipedia). J'ai donc été pomper cet algo (très court), puis adapter en PHP, puis rajouter quelques trucs pour que ça fasse ce qu'on veut.
Je génère un nombre aléatoire avec une loi normale (mu, sigma). Je prends mu = 0, et sigma =35, qui me semble une valeur pas trop mal, que j'ai eu en tatonant.
J'obtiens un nombre, négatif ou positif, souvent aux alentours de 0. Je le soustrais à 100 en valeur absolue. J'obtiens un nombre souvent proche de 100.

Voilà mon code. Il génère 1000 nombres, et affiche les résultats par intervalle, histoire d'avoir une idée de la répartition du truc.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
 
<?php
define('DEUX_PI', ( 2.0 * 3.141592653589793238462643383279502884197169399375 ));
define('SIGMA', 35); // La variance, plus c'est un grand, plus on sera éloigné de 100.
define('NB_SIMULATIONS', 1000); // Nombre de tirages à effectuer
 
/**
 * Générer un nombre aléatoire avec la loi normale
 * espérance $mu
 * ecart-type $sigma
*/
function genererNombreLoiNormale($mu, $sigma) {
 
        // On récupère deux nombres pseudo-aléatoires indépendants selon une loi uniforme sur l'intervalle [0;1]
        $randNumUni = rand(0,999) / 1000;
        $randNumBi = rand(0,999) / 1000;
 
        // On récupère un nombre pseudo-aléatoire selon une loi normale centrée réduite
        // (Paramètres : moyenne = 0, écart-type = 1)
        // Utilisation de l'algorithme de Box-Muller
        $randNumNorm = sqrt(-2.0*log($randNumUni))*cos(DEUX_PI*$randNumBi);
 
        return ($mu + $sigma * $randNumNorm);
}
 
/**
* Génère un nombre entre 100 et -infini. Assez proche de 100 en général...
*/
function genererNombre() {
	$x = intval(genererNombreLoiNormale(0, SIGMA));
	return 100 - abs($x);
}
 
// Tableau récapitulatif des résultats
$intervalles_resultats = array(
	"absurde" => 0,
	"01 - 10" => 0,
	"11 - 20" => 0,
	"21 - 30" => 0,
	"31 - 40" => 0,
	"41 - 50" => 0,
	"51 - 60" => 0,
	"61 - 70" => 0,
	"71 - 80" => 0,
	"81 - 90" => 0,
	"91 - 100" => 0 
);
 
for ($i = 0; $i < NB_SIMULATIONS; $i++)
{
	$x = genererNombre();
	if ($x >= 0)
	{
		// On range le résultat dans le tableau
		if ($x == 100)
		{
			$intervalle = "91 - 100"; //petit cas particulier
		}
		else 
		{
			$dizaine = intval($x / 10);
			$intervalle = $dizaine . "1 - ". ($dizaine+1) . "0";
		}
 
		$intervalles_resultats[$intervalle] ++;
	}
	else 
	{
		$intervalles_resultats["absurde"] ++;
	}
}
 
var_dump($intervalles_resultats);
 
?>
On peut faire varier sigma pour obtenir des résultats différents, plus ou moins proche de 100 souvent.
Climoo est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 19/12/2011, 23h13   #10
Futur Membre du Club
 
Homme
Assistant Maitrise d'Ouvrage
Inscription : novembre 2004
Messages : 34
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 32
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Assistant Maitrise d'Ouvrage
Secteur : Industrie

Informations forums :
Inscription : novembre 2004
Messages : 34
Points : 15
Points : 15
Ah oui c'est pas mal du tout ça. Je viens de tester ton bout de code et faire mumuse avec le sigma et, effectivement, à première vue, ça colle bien avec mon problème.
Je pousserai mes tests demain.

Super ! Merci Climoo.

Par contre, je ne passe pas encore le message en "résolu" dès fois qu'on puisse avancer aussi sur la fonction "stats_rand_gen_beta" de Celira.
Cette fonction m'intéresse également car il semblerait que ce soit la même que j'ai utilisé dernièrement sur un programme Python et j'aimerais bien savoir la transposer aussi en php (pour obtenir sensiblement la même chose avec les mêmes paramètres - 2 chiffres).
memento80 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2011, 19h49   #11
Membre régulier
 
Inscription : février 2007
Messages : 114
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 114
Points : 74
Points : 74
Désolé, je n'ai pas avancé du tout sur le sujet ! Un peu trop de boulot en ce moment... et une gastro pour couronner le tout !
La réponse de Climoo me convient parfaitement en ce qui me concerne !
Celle de Pymento beaucoup moins... au départ, dans le même genre que Pymento, j'avais imaginé faire 2 tirages : 1 de 0 à 100 et 1 de 50 à 100, puis 3 cas toujours aléatoire : éliminez le 1er tirage, éliminez le second, ou faire une moyenne des 2. Mais ça ne me plaisait pas trop non plus. J'ai aussi pensé à faire 2 tirages : un premier de 0 à 99 qui donnera le chiffre de départ du second tirage. Le second tirage donnant le résultat. Ca me plaisait plus mais depuis Climoo à apporter une réponse encore meilleure.
manu_71 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h55.


 
 
 
 
Partenaires

Hébergement Web