JeuWeb - Crée ton jeu par navigateur
[réglé] Coût d'un rand() - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [réglé] Coût d'un rand() (/showthread.php?tid=1602)

Pages : 1 2


[réglé] Coût d'un rand() - uriak - 18-08-2007

Voilà , je paufine en ce moment mon système de combat, destiné à simuler des escarmouches entre des groupes d'adversaires (plutôt que des duels)

Dans sa première forme il risque de nécessité pas mal de génération d'aléa, et je voulais savoir si c'était là une operation coûteuse en terme de perfo que d'appeller un rand() régulièrement.

Pour le moment l'algo ressemble à ça

1 détermination des choix de chaque joueur en cours de journée
2 exécution
on calcule un Facteur d'Attaque, un facteur de Défense et un Niveau d'Engagement pour chaque joueur

FA = somme des FA d'une équipe, FD = somme des FD d'une équipe

puis pour chaque combattant, on fait un rand(FA+FD) (FA de son équipe et FD des ennemis)
si le rand est < FA, il a touché un adversaire. Celui-ci est tiré au sort parmi la liste des adversaires pondérée par leur NE respectifs. Les dégats, probablement aussi affecté par un Rand() sont noté.s
Une fois toutes les attaques portées, on applique les dégats et retire les morts éventuels, un rapport est généré et fourni à la prochaine connexion des participants...

Et est-ce que l'ordre de grandeur de la graine est connu si on ne la présice pas explictement ? Largement supérieur, à disons des intervalles < 1000 ?


RE: Coût d'un rand() - denisc - 18-08-2007

Aucune idée!
Fais-toi un batch pour tester Wink


RE: Coût d'un rand() - uriak - 18-08-2007

je pense que c'est ce que je vais faire ^^

En fait ma crainte c'est pour la résolution des actions simultanées sur mon serveur. Il va s'agir d'appeler une page qui va successivement gérer les nouvelles ressources , les actions en devenir, les combats, et autres joyeusetés. Comment éviter les limites de temps pour php ? ça peut très bien fonctionner normalement jusqu'au jour où...


RE: Coût d'un rand() - joshua - 19-08-2007

mt_rand plutot que rand ^^


RE: Coût d'un rand() - elazard - 19-08-2007

http://www.manuelphp.com/php/function.set-time-limit.php
ca peut peut-être t'aider ^^


RE: Coût d'un rand() - Single Dark - 19-08-2007

Je sais pas si sa pourra t'aider mais je trouve se script sur la toile ( SdZ ) :

Ce qui permet de faire un compte à rebourds en PHP.

Code PHP :
<?php
function rebours($temps)
{
for(
$i = $temps; $i >= 0; $i--)
{
echo
'<span id="id'.$i.'">'.$i.'</span>';
flush();
sleep(1);
echo
'<style>#id'.$i.' { display:none; }</style>';
if(
$i == 0)
echo(
'Terminé !');
}
}
rebours(20);

?>

Pour change la durée du compte à rebours faut changer le '20'


Fonction flush : http://www.manuelphp.com/php/function.flush.php
Fonction sleep : http://www.manuelphp.com/php/function.sleep.php


RE: Coût d'un rand() - uriak - 19-08-2007

merci, je pense avoir eu tous les renseignements nécessaires ^^


RE: Coût d'un rand() - denisc - 19-08-2007

Voici un petit batch qui fonctionne bien:
Code PHP :
<?php
//Initialisation du random (les microsecondes sont une valeur donnée au millionnième -> Multiplier par 1 million pour avoir un entier!
srand((double)microtime()*1000000);
mt_ srand((double)microtime()*1000000);

//Test de 1.000.000 randomization sur une plage définie
$START = time();
for (
$i = 1; $i < 1000000; ++$i) {
$j = rand(1,100);
}
$END = time() - $START;
echo
"1.000.000 rand(x,y) : $END secondes\n";

$START = time();
for (
$i = 1; $i < 1000000; ++$i) {
$j = mt_rand(1,100);
}
$END = time() - $START;
echo
"1.000.000 mt_rand(x,y) = $END secondes\n";

//Test de 1.000.000 randomization sur une plage indéfinie
$START = time();
for (
$i = 1; $i < 1000000; ++$i) {
$j = rand(1,10000000);
}
$END = time() - $START;
echo
"1.000.000 rand() : $END secondes\n";

$START = time();
for (
$i = 1; $i < 1000000; ++$i) {
$j = mt_rand(1,10000000);
}
$END = time() - $START;
echo
"1.000.000 mt_rand() : $END secondes\n";
?>

J'obtiens un mt_rand environ 55% plus rapide que le rand classique.
Par contre, il faudra prendre en compte toutes les actions intermédiaires (accès BD??? Calculs??? Traitement des infos dans des tableaux???) qui prennent également du temps (surtout la BD)!!!!!


RE: [réglé] Coût d'un rand() - Loetheri - 19-08-2007

Si je peux me permettre, ce genre de test est très souvent à prendre avec des pincettes.

Déjà, tout simplement parce qu'on ne fait pas 1.000.000 de fois la même chose dans nos scripts.
Deuxièmement, parce qu'on ne sait pas dans quelle circonstance ce genre de tests ont été fait. Il suffit que je le fasse en local avec un serveur pas optimisé avec d'autres programmes qui tournent pour que le test n'ait aucune signification.

Finalement, parce que ces tests n'ont réellement de valeurs que si tout le monde a le même protocole.

Bien entendu, cela peut permettre dans une certaine optique de calculer ce qui est plus rapide. Mais il faut prendre cela avec des pincettes.


RE: [réglé] Coût d'un rand() - denisc - 19-08-2007

Certes!
En général, je fais ces tests pour choisir une commande ou une boucle de calculs parmi plusieurs options qui s'offrent à moi.
Dans tous les cas, j'exécute les batches en local ET sur mon seveur .fr (mon hébergeur). Les résultats sont toujours très proches à quelques ms prêt.