• 11 Juin 2024, 14:29:35


Auteur Sujet: Question sur 'random'  (Lu 1324 fois)

0 Membres et 1 Invité sur ce sujet

Hors ligne Nikko™

  • *
  • Mafioso
  • Messages: 2393
    • Voir le profil
Question sur 'random'
« 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
« Modifié: 03 Février 2009, 20:58:22 par Nikko™ »

Hors ligne [viruz]rider_77

  • *
  • Mafioso
  • C/C++ programming
  • Messages: 2154
    • Voir le profil
Re : Question sur 'random'
« Réponse #1 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

Hors ligne Azz45

  • Good Player
  • *
  • Mafioso
  • RolePlay Player
  • Messages: 2809
    • Voir le profil
Re : Question sur 'random'
« Réponse #2 le: 03 Février 2009, 21:51:40 »
Salut,

Non rider sinon sa reprend tout a 0.

Faut mettre un if a mon avis ;)

~•~  ~•~  ~•~  ~•~  ~•~  ~•~  ~•~  ~•~  ~•~  ~•~  ~•~


~•~  ~•~  ~•~  ~•~  ~•~  ~•~  ~•~  ~•~  ~•~  ~•~  ~•~~•~  ~•~  ~•~  ~•~
Avancement du GM : 3%
~•~  ~•~  ~•~  ~•~  ~•~  ~•~  ~•~  ~•~  ~•~  ~•~  ~•~
~•Merci Kloken, pour la vidéo lors de mon anniversaire•~

Hors ligne Syg

  • Expert programmeur C/C++/PAWN
  • *
  • The GTAOnline Jesus
  • Messages: 3908
    • Voir le profil
Re : Question sur 'random'
« Réponse #3 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
Courtesy of GtaManiac

Hors ligne MrFredo

  • *
  • Grand Banditisme
  • Scripteur PHP/PAWN
  • Messages: 953
    • Voir le profil
    • GTA-Hosting
Re : Question sur 'random'
« Réponse #4 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;
}

Hors ligne Nikko™

  • *
  • Mafioso
  • Messages: 2393
    • Voir le profil
Re : Question sur 'random'
« Réponse #5 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

Hors ligne [viruz]rider_77

  • *
  • Mafioso
  • C/C++ programming
  • Messages: 2154
    • Voir le profil
Re : Question sur 'random'
« Réponse #6 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

Hors ligne MrFredo

  • *
  • Grand Banditisme
  • Scripteur PHP/PAWN
  • Messages: 953
    • Voir le profil
    • GTA-Hosting
Re : Question sur 'random'
« Réponse #7 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

Hors ligne Nikko™

  • *
  • Mafioso
  • Messages: 2393
    • Voir le profil
Re : Question sur 'random'
« Réponse #8 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

Hors ligne MrFredo

  • *
  • Grand Banditisme
  • Scripteur PHP/PAWN
  • Messages: 953
    • Voir le profil
    • GTA-Hosting
Re : Question sur 'random'
« Réponse #9 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

Hors ligne Nikko™

  • *
  • Mafioso
  • Messages: 2393
    • Voir le profil
Re : Question sur 'random'
« Réponse #10 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  :)

Hors ligne Syg

  • Expert programmeur C/C++/PAWN
  • *
  • The GTAOnline Jesus
  • Messages: 3908
    • Voir le profil
Re : Question sur 'random'
« Réponse #11 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
Courtesy of GtaManiac

Hors ligne [viruz]rider_77

  • *
  • Mafioso
  • C/C++ programming
  • Messages: 2154
    • Voir le profil
Re : Question sur 'random'
« Réponse #12 le: 05 Février 2009, 23:10:07 »
Pas mal plus simple ton truc Syg :P