Rechercher : dans
Par :

Random-shuffle sur tableau en c++

Dernière réponse le 20 nov 2007 à 02:49:06 jerem, le 20 nov 2007 à 01:53:47 
 Signaler ce message aux modérateurs

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

Configuration: Windows XP
Firefox 2.0.0.9

Meilleures réponses pour « Random shuffle sur tableau en c++ » dans :
Trier un tableau sans utiliser la fonction sort VoirTrier un tableau sans utiliser la fonction sort D'abord on initialise une variable $max avec la 1ère valeur de tableau. Ensuite on va faire une boucle tant que le tableau contient encore des éléments. C'est avec la fonction splice qui a le rôle...
Inverser les éléments d'un tableau -Récursivité- VoirVoici une procédure récursive qui permet d’inverser les éléments d’une partie d’un tableau compris entre la position p et n : Procedure Inverser (Var t : Tab; p, n : Integer); Var aux : Real; Begin If p < n Then ...
Décaler les éléments d'un tableau (Rotation) -Récursivité- VoirVoici une procédure récursive qui permet de décaler tous les éléments d’un tableau d’une position à droite à partir de la position p Procedure Decaler (Var t : Tab; p, n : integer); Begin If p
Les structures en langage C VoirDifférence entre une structure et un tableau Un tableau permet de regrouper des éléments de même type, c'est-à-dire codés sur le même nombre de bits et de la même façon. Toutefois, il est généralement utile de pouvoir rassembler des éléments de...
Les structures en langage C++ VoirDifférence entre une structure et un tableau Un tableau permet de regrouper des éléments de même type, c'est-à-dire codés sur le même nombre de bits et de la même façon. Toutefois, il est généralement utile de pouvoir rassembler des éléments de...
Langage C - Les chaînes de caractères VoirQu'est-ce qu'une chaîne de caractères ? Une chaîne de caractères (appelée string en anglais) est une suite de caractères, c'est-à-dire un ensemble de symboles faisant partie du jeu de caractères, défini par le code ASCII. En langage C, une chaîne...

1

davmk, le 20 nov 2007 à 02:05:27

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é ^^

Répondre à davmk

2

jerem, le 20 nov 2007 à 02:12:49

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

Répondre à jerem

3

davmk, le 20 nov 2007 à 02:21:26

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.

Répondre à davmk

4

jerem, le 20 nov 2007 à 02:29:14

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

Répondre à jerem

5

jerem, le 20 nov 2007 à 02:35:07

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...

Répondre à jerem

6

davmk, le 20 nov 2007 à 02:44:39

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++.

Répondre à davmk

7

 jerem, le 20 nov 2007 à 02:49:06

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!

Répondre à jerem