Powered by Invision Power Board


Forum Rules Bienvenue dans la Distillerie d'entraide

Quelques soient vos problèmes, nous sommes là !

  Reply to this topicStart new topicStart Poll

> [Maths] Fonction pour un coefficient semi-aléatoire, Saugrenu ? Je sais...
Le poussin
Écrit le : Jeudi 30 Septembre 2004 à 19h50


Roi des abysses
Group Icon

Groupe : Citoyens
Messages : 507
Membre n° : 310
Inscrit le : 22/09/2003




Voilà, je recherche une formule destinée à un programme qui me permettrait de transformer un nombre totalement aléatoire (compris entre 0 et 1) en un nombre semi-aléatoire n'étant plus équi-probable mais qui, suivant la valeur d'un certain coefficient donné, donnerait (par exemple) plus de chances aux valeurs proches de 0 qu'aux valeurs proches de 1.
Toutes les fonctions mathématiques usuelles peuvent servir, donc pas de limitations à ce niveau là.


Typiquement il s'agit du coefficient aléatoire qui apparaît dans les RPGs pour déterminer si le coup est raté, critique ou normal. Simplement là il faut également que le coefficient puisse être déterminé en dehors des cas extrêmes correspond au critique et au raté. Et celui-ci varierai selon un coefficient (style dextérité ou adresse) qui, plus il est elevé, plus on a de chances d'obtenir un coup critique et inversement. Comme pas mal de personnes font du making et s'intéressent aux RPGs sur ce forum, peut-être que l'une d'elles aurait une idée de la tête qu'ont les formules calculant ce type des coefficents dans les jeux.

Mathématiquement parlant il me faudrait une fonction mathématique de [0,1] dans [0,1], prenant la valeur 0 en 0 et 1 en 1, qui à la valeur aléatoire initiale associe la valeur aléatoire arrangée suivant le coefficient en question.
Une fonction qui conviendrait bien serait par exemple une fonction admetant la droite d'équation y = x - 1 pour axe de symétrie qui correspondrait à l'identité pour les valeurs moyennes du coefficient et qui se "convexerait" ou se "concaverait" suivant les variations du coefficient. L'idéal serait d'avoir une dérivée infinie en 1 et nulle en 0 pour une fonction convexe (et inversement pour une fonction concave).
On arrive à obtenir une fonction de ce style en prenant le quart d'un cercle de rayon 1, mais je n'ai pas réussi à trouver une formule un minimum générale qui permettrait de balayer toute la plage des fonctions (fonctions "très" convexes -> identité -> fonctions "très" concaves), surtout que coordonnées cartésiennes et cercles ne vont pas très bien ensemble.


J'avoue ne pas être très très clair dans mes explications, mais si quelqu'un avait une solution je lui en serait très reconnaissant. happy.gif

PS : Je ne savais vraiment où placer ce topic, j'espère ne pas m'être trop planté. unsure.gif


--------------------
Cot cot cot user posted image
Mon site : user posted image
PMUsers Website
Top
Forty-two
Écrit le : Vendredi 01 Octobre 2004 à 14h47


Script Master
Group Icon

Groupe : Admin
Messages : 364
Membre n° : 262
Inscrit le : 04/08/2003




Y'a un moyen, assez compliqué (calculatoire), mais qui a le mérite de fonctionner.

Soit a le coefficient de convexité. On se place d'abord dans un repère adapté, avec f(x) = ax(1 - x). On a alors une jolie courbe en cloche avec f(0) = f(1) = 0 ainsi que f(1/2) maximal et dépendant de a.

Ça c'était la partie facile.

Maintenant il faut faire tourner tout ça de 45° vers la gauche. Donc changement de repère + zoom pour éviter des sqrt(2)/2 partout et rester dans le carré (0,0)(1,1).
x'(t) = x(t) + y(t)
y'(t) = x(t) - y(t)
avec :
x(t) = t
y(t) = f(t)

Exprimons t avec x' pour avoir une fonction y'(t(x')) = y'(x'). Je passe les détails, avec une équation du second degré on obtient un truc bien moche :
t = { 1 + a - sqrt[ (1+a)² - 4ax' ] } / 2a

Il reste à remplacer t par sa valeur dans y'(t) :
y'(x') = { 1 - sqrt[ (1+a)² - 4ax' ] } / a + 1 - x'

On a alors une jolie fonction x' -> y(x') concave ou convexe à l'envie : il suffit de modifier a.
a < 0 => convexe
a = 0 => droite
a > 0 => concave
Il faut gérer séparément le cas a = 0 pour ne pas avoir de division par zéro. En pratique, si la valeur absolue de a est très petite (par exemple abs(a) < 10^-4), alors on peut considérer que a = 0 et que la courbe a pour équation y = 1 - x.

Bonus : les courbes pour a = -A et a = +A sont symétriques par rapport à la droite d'équation y = 1 - x.


Au moment de programmer la fonction y'a peut-être moyen de factoriser intelligemment l'expression pour accélérer le calcul. Mais du moment qu'on n'évalue pas la fonction plein de fois par seconde ça devrait aller.

Pour la petite histoire, j'ai trouvé la fonction de départ de manière naïve : on cherche un polynôme de degré 2 passant aux points (0,0) et (1,0) tel que f'(0) = a et f'(1) = -a. Dès le début on pouvait prévoir l'influence de a sur la convexité de la courbe, on était donc certain d'obtenir le bon résultat, avec cependant le risque d'obtenir une expression finale horrible.


--------------------
#define QUESTION ((2b) || !(2b))
#define ANSWER 42

mon site perso
PMEmail PosterUsers Website
Top
Le poussin
Écrit le : Vendredi 01 Octobre 2004 à 20h29


Roi des abysses
Group Icon

Groupe : Citoyens
Messages : 507
Membre n° : 310
Inscrit le : 22/09/2003




Ouah génial ! Ça colle très bien avec mes besoins, je n'en attendais pas moins de toi. tongue.gif


--------------------
Cot cot cot user posted image
Mon site : user posted image
PMUsers Website
Top
1 utilisateur(s) sur ce sujet (1 invités et 0 utilisateurs anonymes)
0 membres :

Topic Options Reply to this topicStart new topicStart Poll

 


Habillé par Shadowillusions

Sites de nos membres :
Le blog de Mortis Ghost Le site de la réécriture Avatar RPG Le site de Fauna Friends