Random-shuffle sur tableau en c++

Fermé
jerem - 20 nov. 2007 à 01:53
 jerem - 20 nov. 2007 à 02:49
Bonjour,
je suis actuellement en train d'ecrire un petit programme en c++, dans lequel j'ai un tableau trié.
J'aimerai qu'à chaque lancement du programme, le tableau soit mélangé de manière aléatoire.
J'ai donc utilisé la fonction "random_shuffle(Tableau, Tableau + 10);"

Mon problème est que la première valeur reste en place (1 en position 1) et la dernière aussi (10 en position 10)
Mon second problème est que le mélange est toujours le même à chaque lancement du programme, il ne semble donc pas être aléatoire du tout.
Mon troisième problème est qu'une des valeurs est replacée par 0 (Zéro).

Si quelqu'un connait cette fonction et pourrai m'apporter quelques explications/aide, j'en serai très heureux....

merci. Jérémie
A voir également:

7 réponses

davmk Messages postés 7 Date d'inscription mardi 20 novembre 2007 Statut Membre Dernière intervention 20 novembre 2007
20 nov. 2007 à 02:05
Bonjour,
si je ne me trompe pas, tu dois initialiser la "base aléatoire". En C, il suffit d'inclure "time.h" et de faire srand(time(NULL)). Il doit donc y avoir un code similaire en C++.

Comme tu as pu le constater, il ne s'agit pas de nombres aléatoires mais de nombres "pseudo-aléatoires" générés par un algorithme de calcul plus ou moins efficace. Ces calculs se basent sur un nombre appel. la "base aléatoire", qui doit donc changer sans quoi l'algorithme retournera toujours les mêmes valeurs. en faisant srand(time(NULL)), tu affectes à la "base aléatoire" le temps courant, ce qui permet d'avoir des nombres différents à l'éxécution (sauf si l'intervalle est trop petite, de l'ordre des microsecondes).

En espérant t'avoir aidé ^^
0
Salut davmk!

Je suis bien content, en suivant tes conseils ca marche beaucoup mieux! J'avais bien saisi ce concept de pseudo-aléatoire, mais je pensai que la référence à l'heure courante était déjà incluse dans la fonction.Donc maintenant le mélange est bien différent d'un lancement à l'autre du programme. Par contre, une des valeurs est toujours remplacée par 0, et la dernière valeur ne bouge jamais...10 reste en position 10... Aurais tu une idée quant à cela? merci
0
davmk Messages postés 7 Date d'inscription mardi 20 novembre 2007 Statut Membre Dernière intervention 20 novembre 2007
20 nov. 2007 à 02:21
Je ne suis pas sur, mais est-ce que cela ne devrait pas plûtot être random_shuffle(Tableau, Tableau + 9) si ton tableau a 10 éléments? Car la plage de données varie de l'index 0 à 9 et non de 1 à 10.

Essaie cela, peut-être que ça pourrait aider.
0
Eh bien à vrai dire j'avais flairé un truc comme ca, et ca ne change rien, quelle que soit la valeur passé en paramètre...du coup je ne vois pas bien à quoi sert cet argument. J'ai essayé avec un tableau de 50 éléments, et même si je passe (tableau;tableau+ 40) ca mélange quand même, mais la valeur 50 reste en 50ème position....c'est très curieux
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
oups au temps pour moi, ce paramètre sert bien à préciser combien de "n" premiers rangs il faut mélanger, sans toucher au suivants. Donc avec + 40 ca me mélange bien les 40 premiers nombres, et pas les dix derniers. Mais à +50, il n'en mélange que 49...
Le fait qu'un zéro apparaisse me laisse penser qu'il y a comme tu dis chez moi une confusion entre les valeurs contenues dans les tableau, de 1 à n, et l'indice du tableau, de 0 à n. Mais que j'essaye tableau +(n-1), tableau +(n), ou tableau +(N+1) , cette fichue enième valeur ne bouge jamais...
0
davmk Messages postés 7 Date d'inscription mardi 20 novembre 2007 Statut Membre Dernière intervention 20 novembre 2007
20 nov. 2007 à 02:44
Bizarre,

j'ai le code suivant et il trie tous les nombres:

#include <iostream>
#include <algorithm>
#include <time.h>
using namespace std;

int main()
{
    srand(time(NULL));
    int a[] = {1,4,3,6,8,89,35,25};
    random_shuffle(a, a+8);
    for(int i = 0; i < 8; i++){
        cout << a[i] << ":";
    }
    cout << endl;
    return 0;
}


Sorties:
3:89:8:1:6:25:4:35:
1:35:25:3:8:4:6:89:
etc...
Et, selon la documentation, le générateur calcule quelle possibilité prendre parmi les (2e paramètre - 1er paramètre)! possibilités de triage. Il faut donc que ce chiffre soit égal au nombre de données pour avoir un résultat convenable.

Désolé pour le code un peu bâtard, mais je suis plus habitué en C qu'en C++.
0
re:)

J'ai trouvé finalement, ca marche en écrivant (tableau+1; tableau+(N+1)) Donc tu avais raison, la syntaxe originale n'est valable que si la première valeur du tableau est égale à l'indice 0 du tableau. Depuis je n'ai plus de zéro qui apparait dans la liste mélangée, et la dernière valeur est brassée. Désolé, je suis débutant en c++ j'aurai peut etre pu chercher un peu mieux. Merci en tout cas de m'avoir filé le tuyau pour <time.h>, et m'avoir aiguillé sur les valeurs d'indice à 0; Bonne nuit,et a plus tard peut être, parceque j'aurai surement d'autres questions à poser d'ici peu! Salut Dav!
0