GTAOnline.net

San Andreas Multiplayer (sa:mp) => Scripting SA-MP [Pawn center] => Discussion démarrée par: Nikko™ le 03 Février 2009, 20:31:24

Titre: Question sur 'random'
Posté par: Nikko™ le 03 Février 2009, 20:31:24
Bonjour a tous,

Bon voila dans mon GM, j'utilise une fonction qui me pioche 6 numéros au hasar:

numerosjoueur(playerid)
{
PlayerNumber[0][playerid] = random(49);
PlayerNumber[1][playerid] = random(49);
PlayerNumber[2][playerid] = random(49);
PlayerNumber[3][playerid] = random(49);
PlayerNumber[4][playerid] = random(49);
PlayerNumber[5][playerid] = random(49);
}

Sauf qu'il arrive, ce qui est tres logique, qu'on tombe plusieur fois sur le meme numéro.
Alors existe t-il une fonction ou si c'est possible de coder quelque chose qui fait que ca ne prend pas plusieur fois le meme numéro...
Merci d'avance :)

++
nikko
Titre: Re : Question sur 'random'
Posté par: [viruz]rider_77 le 03 Février 2009, 21:47:46
Bah je connais rien au Pawn, mais si on analyse ça d'oeil plus programmation générale, je te dirais te coder ton petit truc :D
Tu n'as qu'à faire une vérification.
Si le numéro est déjà utilisé, on refait un random.

Je sais pas si ça peut vraiment t'aider, mais j'ai jamais touché au Pawn :P
Titre: Re : Question sur 'random'
Posté par: Azz45 le 03 Février 2009, 21:51:40
Salut,

Non rider sinon sa reprend tout a 0.

Faut mettre un if a mon avis ;)
Titre: Re : Question sur 'random'
Posté par: Syg le 03 Février 2009, 22:03:16
Pour faire ça, tu fais une boucle (do .... while) jusqu'à ce que tous les numéros soient choisis.
Un numéro est choisi si il est différent de tous les autres (comme l'a dit très justement Rider pendant que je répondais à ce post).

J'ai fait un bout de script mais je ne le donne pas tout de suite, je préférerais que d'autres donnent une réponse, moi je suis vieux, je n'ai plus rien à prouver :)

++
Syg
Titre: Re : Question sur 'random'
Posté par: MrFredo le 03 Février 2009, 22:30:50
Un truc de ce style?

Code: (pawn) [Sélectionner]
new Numero[6];

Numero[0] = RandomNumero();
Numero[1] = RandomNumero();
Numero[2] = RandomNumero();
Numero[3] = RandomNumero();
Numero[4] = RandomNumero();
Numero[5] = RandomNumero();

RandomNumero()
{
new numero;
do
{
   numero = random(49);
}
while(numero == Numero[0] || numero == Numero[1] || numero == Numero[2] || numero == Numero[3] || numero == Numero[4] || numero == Numero[5]);

return numero;
}

J'ai tester avec un petit random (7) et la boucle tourne vraiment jusqua trouver des chiffre diferent pour chaque variable (pour mon test j'ai mit un printf dans le do et a la fin de la fonction pour voir cb de fois la boucle était passé avant d'avoir un numéro different)

Edit pour ceux que sa interesse voici ma fonction de test:

Code: (pawn) [Sélectionner]
RandomNumero()
{
new numero,count = 0;
do
{
    numero = random(7);
    printf("RandomNumero = %d",numero);
count++;
}
while(numero == Numero[0] || numero == Numero[1] || numero == Numero[2] || numero == Numero[3] || numero == Numero[4] || numero == Numero[5]);

printf("Numero %d trouver en %d passe",numero,count);
return numero;
}
Titre: Re : Question sur 'random'
Posté par: Nikko™ le 03 Février 2009, 22:51:49
je pense que ca doit etre bon mais jaimerai bien comprendre.

pourquoi :

while(numero == Numero[0] || numero == Numero[1] || numero == Numero[2] || numero == Numero[3] || numero == Numero[4] || numero == Numero[5]);
la boucle continue jusqua que numero == Numero[0] OU que numero == Numero[1] OU ... ??

++
nikko
Titre: Re : Question sur 'random'
Posté par: [viruz]rider_77 le 03 Février 2009, 22:52:10
Petit rappel : Je n'ai jamais touché au Pawn, mais en m'inspirant du post de MrFredo je coderais un truc du genre :

Code: (c) [Sélectionner]
new Numero[6];

Numero[0] = RandomNumero();
Numero[1] = RandomNumero();
Numero[2] = RandomNumero();
Numero[3] = RandomNumero();
Numero[4] = RandomNumero();
Numero[5] = RandomNumero();

new numeroOccupe;

RandomNumero()
{
for(i = 0; i < 6; i++)
{
for(u = i+1; u < 6; u++)
{
while(numero[i] == numero[u])
{
  numero[i] = random(49);
}
}
}

return numero;
}

Remarque que j'ai codé ça vite et j'ai même pas compiler rien :P
Titre: Re : Question sur 'random'
Posté par: MrFredo le 03 Février 2009, 22:58:09
Le while(....) est une condition qui fait continuer la boucle si la condition est vraie (un peux comme un 'if') donc si 'numero' equivaut a une des valeur d'une des variable 'Numero[]' on refait un 'random' et on repasse par la condition et si 'numero' est tjr egal a un des 'Numero[]' on refait un 'random' ainsi de suite jusqua se que 'numero' ne soit plus egal a aucun des 'Numero[]'

J'ai un peux de mal a expliquer mais ptet que quelqu'un expliquera mieux que moi

Edit un code simple qui permet de comprendre

Code: (pawn) [Sélectionner]
new i = 0;
do
{
     i++;// On augmente la valeur de i
     printf("Boucle %d",i);
}
while(i != 5); //Si i n'est pas egal a 5 on repasse par le do

Une fois que i vaudra 5 la boucle s'arrete
Titre: Re : Question sur 'random'
Posté par: Nikko™ le 04 Février 2009, 12:24:45
Ca ne serait pas

while(numero != Numero[0] || numero != Numero[1] || numero != Numero[2] || numero != Numero[3] || numero != Numero[4] || numero != Numero[5]);
++
nikko
Titre: Re : Question sur 'random'
Posté par: MrFredo le 04 Février 2009, 12:29:11
Non non faut tester si numero est egal a un des 'Numero[]' pour que si elle trouve que c'est egal a un des 'Numero[]' elle recommence et cherche un autre 'numero' qui sera diferent (ou pas mais tant qu'elle trouve pas un diferent elle recomence) pour mieux comprendre je te conseil de tester ma fonction de test :)

Pck j'ai un peux de mal a expliquer XD
Titre: Re : Question sur 'random'
Posté par: Nikko™ le 04 Février 2009, 12:33:55
Ok je testerai,

Parce que pour moi while(numero == Numero[0] || numero == Numero[1] || numero == Numero[2] || numero == Numero[3] || numero == Numero[4] || numero == Numero[5]);
Ca veu dire qu'il cherche jusqua que numéro soit = a Numero[] mais je te croi ^^

++
nikko

EDIT: j'ai compris merci  :)
Titre: Re : Question sur 'random'
Posté par: Syg le 05 Février 2009, 22:48:03
C'est pas mal Fredo.
Mais, comme random (49) donne un nombre entre 0 et 48, ta solution ne permet pas de choisir 0 (puisque c'est la valeur initiale des éléments du tableau). Le problème disparait si on utilise random (49)+1 qui donne bien un nombre entre 1 et 49.

Nikko :
Pour bien comprendre le while, il suffit de le traduire par "tant que", ensuite tout devient évident.
while (i<=5) // Tant que i est plus petit que ou égal à 5
{
   i++;
}

do //faire
{
   i++;
}
while (i!=4); // Tant que i est différent de 4

Sinon, voici la solution que j'avais trouvée pour la question de Nikko :
/* Initialisation des numéro (nécessaire dans le cas où on utilise plusieurs fois la fonction sinon certains numéro
   contenus dans un tirage ne pourront pas être choisi lors du tirage suivant) */
for (new n=0 ; n<6 ; n++) PlayerNumber[n][playerid] = 0;

new NombresChoisis = 0;
new rand;
do
{
   rand = random(49) + 1;

   /* Si le nombre est différent de tous les autres (heureusement qu'on ne choisi que 6 nombres ... ) */
   if (rand != PlayerNumber[0][playerid] && rand != PlayerNumber[1][playerid] && rand != PlayerNumber[2][playerid] &&
       rand != PlayerNumber[3][playerid] && rand != PlayerNumber[4][playerid] && rand != PlayerNumber[5][playerid])
   {
      /* On stocke le nombre car il n'est égal à aucun autre */
      PlayerNumber[NombresChoisis][playerid] = rand;

      /* Nombre suivant */
      NombresChoisis++;
   }
   /* Sinon, on refait un tour de do ... while et on choisi un autre nombre aléatoire */
}
while (NombresChoisis != 6); // Tant qu'on a pas choisi nos 6 chiffres

++
Syg
Titre: Re : Question sur 'random'
Posté par: [viruz]rider_77 le 05 Février 2009, 23:10:07
Pas mal plus simple ton truc Syg :P