Random ?

Répondre
Partager Rechercher
Es ce que quelqu'un sait comment fonctionne cette fonction ?

D'après mes tests, cette fonction n'est pas un vrai random.
Ou alors, je n'ai pas compris comment elle fonctionne.

Essayer ca sur un onenter d'une zone et vous serez surpris du résultat (c'est toujours la même valeur qui est renvoyée. Au mieux j'ai obtenue 4 valeurs différentes sur une trentaine de valeur).

object oPC = GetEnteringObject();
int iRandom = Random(101);
SendMessageToPC(oPC, IntToString(iRandom));


Apparement si l'on fait une action (boire une potion par exemple) avant d'entrer dans la zone la valeur change.
C'est un random tout ce qu'il y a de plus vrai. Le problème est toujours le même : comment les nombres aléatoires sont obtenus.

Ca m'est arrivé de constater que, lorsqu'on appelle plusieurs fois très rapidement cette fonction, il y a beaucoup de répétitons. Il n'y a pas vraiment de moyen d'y remédier, si ce n'est l'utiliser avec parcimonie et pas directement sur le OnEnter
Effectivement c'est le fait de mettre le random dans un onEnter qui perturbe le résultat.

Apparement le point de départ de l'horloge du random c'est le temps qui s'écoule depuis l'apparition d'un joueur dans la zone dans laquelle le script est appelé.

Puisque pour mon test je le met dans le onEnter, le temps de charger la zone varie peu et renvoie donc toujours la même valeur. (par contre le même script dans un onUse d'un objet fonctionne tres bien)

Voici une solution pour un random dans un onEnter, remplacer le random(101) par :
Code PHP:

int iRandom = (GetTimeMillisecond()+1)/10
Une petite méthode de génération de nombres pseudo-aléatoire...
Avantage : tu ne générera pas le même nombre en rentrant sur une zone
Inconvenient : c'est une suite... donc a partir d'un nombre donné les nombres générés a la suite seront toujours les mêmes...
Mais c'est suffisant pour donner l'illusion d'une génération aléatoire dans la plupart des cas

Allez on commence :
D'abord créer un nouveau script, enlever la fonction main() et y mettre :

Code PHP:

int GetRandomint nNum )
{
int nSeed =  GetLocalInt(GetModule(), "Random_Seed");

//calculate new seed
nSeed = (nSeed 69) + 1;

string sSeed;

if ( 
nSeed 999 ){
    
sSeed IntToStringnSeed );
    
nSeed StringToInt(GetStringRightsSeed));
    }

SetLocalIntGetModule(), "Random_Seed"nSeed );

//generate the random number from seed
float fSeed IntToFloatnSeed );
float fNum IntToFloatnNum );

int nResult FloatToIntfSeed fNum 1000 );

return 
nResult;

Sauvegarder le tout sous le nom 'inc_random'.

deuxième étape, insérer dans le 'OnModuleLoad' la ligne suivante :
Code PHP:

SetLocalIntGetModule(), "Random_Seed"GetTimeMillisecond() ); 

et voila...

Maintenant, comment utiliser cette fonction :

au début du script ou tu veux l'utiliser, rajouter
Code PHP:

#include "inc_random" 

après tu peux utiliser la fonction GetRandom(X), ou X est un entier quelconque, et qui te renverra un entier pseudo-aléatoires compris entre 0 et X-1.

Voila, je sais pas si ça te sera utile, mais vu que j'ai trouvé amusant de bricoler ça, ce serait bête de pas en faire profiter tout le monde
Je viens juste d'éditer mon message précédent.

Ne t'inquiète pas, ce que tu donne la pourra toujours servir pour obtenir une valeur autre qu'un pourcentage (genre un random(361)).
Le problème vois-tu, c'est que ta méthode a un défaut énorme : si tu appelles dans fonctions plusieurs fois dans la même seconde, tu vas obtenir une suite de nombres croissante...
La méthode que je te présente la, he bien... elle est très utilisée déjà... possible même que ce soit le genre de méthode utilisé quand tu programmes en C
Ce code est adapté du code source d'un autre jeu : Q3A...
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés