IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++Builder Discussion :

nombres aléatoires sans doublon c++ builder


Sujet :

C++Builder

  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 132
    Par défaut nombres aléatoires sans doublon c++ builder
    Bonjour,

    J'aimerais générer une liste de nombres aléatoires (de 0à 104) sans doublons et j'ai trouvé le code ci-dessous.

    Le compilateur trouve une erreur dans cette ligne : int* resultat=malloc((taille)*sizeof (int)); // Impossible de convertir 'void *' en 'int *'
    Quelqu'un a t-il une solution ? (j'ai trouvé un code semblable, même erreur)

    Merci d'avance

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    int rand_a_b(int a, int b)
    {
    	return rand()%(b-a);
    }
     
     int* init_sans_doublons(int a, int b)
     {
     
    	int taille = b-a;  // entier = malloc (sizeof (*entier)); 
     
    	int* resultat=malloc((taille)*sizeof (int)); // Impossible de convertir 'void *' en 'int *'
     
    	int i=0;
     
    	// On remplit le tableau de manière à ce qu'il soit trié
     
    	for(i = 0; i< taille; i++)
    	{
     
    		resultat[i]=i+a;
     
    	}
     
    	return resultat;
     
    }
     
     void melanger(int* tableau, int taille)
    {
     
    	int i=0;
     
    	int nombre_tire=0;
     
    	int temp=0;
     
     
     
    	for(i = 0; i< taille;i++){
     
    		nombre_tire=rand_a_b(0,taille);
     
    		// On échange les contenus des cases i et nombre_tire
     
    		temp = tableau[i];
     
    		tableau[i] = tableau[nombre_tire];
     
    		tableau[nombre_tire]=temp;
     
    	}
     
    }
     
    int main(){
     
            // A ne pas oublier !
     
            srand(time(NULL));
     
            int a=0;
     
            int b=0;
     
            int i =0;
     
            int* t=NULL; // Va contenir le tableau de nombres
     
     
     
            do{
     
                    printf("Rentrez le premier nombre : ");
     
                    scanf("%d",&a);
     
                    printf("Rentrez le second, plus grand que le premier : ");
     
                    scanf("%d",&b);
     
            }while(b<=a);
     
     
     
            // On commence pour de vrai ici :
     
            t=init_sans_doublons(a,b);
     
            melanger(t,b-a);
     
     
     
            printf("La suite aléatoire est : ");
     
            for(i=0; i<b-a; i++){
     
                    printf("%d ",t[i]);
     
            }
     
            printf("\n");
     
     
     
            // Ne pas oublier de libérer le tableau
     
            free(t);
     
            return 0;
     
    }
    A moins qu'il y ait plus simple avec randomize : randomize(); for(i=0; i<104; i++) {j= random(104);ListBox1->Items->Add(IntToStr(j)); }. Ca marche mais il y a des doublons.

  2. #2
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Tu compile en C++, qui interdit les conversions implicite de void* en truc* (ici, truc étant int).
    Ton code est très C.

    En C++, j'écrirai probablement une combinaison de std::iota (pour générer les nombres de 0 à 104) puis std::shuffle
    doc de iota
    doc de shuffle

    L'exemple de std::iota devrait te donner un bon point de départ.

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 132
    Par défaut
    Merci pour tes réponses ternel mais apparemment c++ builder starter ne reconnaît pas std::mt19937, std::random_device ...

    A moins que quelque chose m'échappe car j'ai commencé à étudier le c++ en février.

    Par contre, j'ai trouvé un code qui a l'air de fonctionner :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    //---------------------------------------------------------------------------
     
    #include <fmx.h>
    #pragma hdrstop
     
    #include "alea.h"
     
    #include <iostream>
     
    #include <time.h>
     
     
     
    using namespace std;
     
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.fmx"
     
    TForm2 *Form2;
     
    int random(const int MIN, const int MAX)
    {
    		int random;
    		return random = (rand() %  100+4);
    }
     
    int randomNoDouble(int min, int max, long *tableau, long sizeTableau, int i)
    {
            bool ok;
     
    		do
            {
    				tableau[i] = random(104);
                    ok = false;
                    if(i>0)
                    {
    // condition de sortie : tant qu'il est tdifférent de -1 parce que ça sert à rien de tester plus loin
                            for(int j=0; j<sizeTableau && tableau[j] != -1;j++)
                            {
    // pour ne pas tester la même valeur en permanence.
                                    if(i != j && tableau[i] == tableau[j])
                                    {
    // on continue la boucle si on trouve 2 valeurs identiques.
                                            ok = true;                                }
                            }
                    }
            }while(ok);
     
            return tableau[i];
    }
     
     
     
    //---------------------------------------------------------------------------
    __fastcall TForm2::TForm2(TComponent* Owner)
    	: TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm2::Button1Click(TObject *Sender)
    {
       ListBox1->Clear();
     
    		srand(time(NULL));
    		long size = 104;
    		long *tab = NULL;
    		int min = 0, max = 104;
     
    		tab = new long[size];
    		for (int i=0;i<104;i++) {
                    tab[i] = -1;
    // j'initialise les valeurs  du tableau à des valeurs qu'il ne devrait pas contenir
            }
    		int j=0;
    		for(int i = 0 ; i <104 ; i++)
    		{
    		j=randomNoDouble(min,max,tab,size,i);
    		ListBox1->Items->Add(IntToStr(j));
            }
     
            delete[] tab;
    }
    //---------------------------------------------------------------------------
    Cordialement.

  4. #4
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Recherche l'option pour active le C++14 (ou à la rigueur le C++11). Tu sembles compiler avec une ancienne version du C++ (en fait la norme publiée en 2003, il y a presque quinze ans).

    Au passage, en C++ depuis 2003, ce n'est pas <time.h> mais <ctime> qu'il faut inclure. La différence est mineure, mais <time.h> est prévue pour ne plus exister.

    Détail, utilise la balise [code], c'est à dire le boutont "#".

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 132
    Par défaut
    Merci ternel pour les tuyaux.

    Pour <ctime>, j'ai rectifié.

    J'utilise C++Builder 10.1 Berlin Starter que j'ai téléchargé en février de cette année. Une version récente ...

    Je ne vois pas comment activer c++11 ou 14. Dans Projet + Options de starter, je n'ai rien trouvé.

  6. #6
    Membre Expert
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Billets dans le blog
    1
    Par défaut
    Salut,
    pour utiliser le compilateur Clang BCC32C

    Pour activer BCC32 pour un projet particulier, sélectionnez Projet > Options > Compilateur C++ puis, sous Compilateur classique, désactivez l'option "Utiliser le compilateur Borland 'classique'".
    cdlt
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  7. #7
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 132
    Par défaut
    Ça marche !

    Merci DJMSoftware pour le tuyau et le lien.

    Cordialement

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Tableau 2D de nombres aléatoires sans doublon de lignes
    Par lilalvine dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 17/02/2017, 21h06
  2. liste de nombres aléatoire sans doublon
    Par rudyhadoux2 dans le forum Langage
    Réponses: 10
    Dernier message: 14/09/2009, 18h30
  3. Réponses: 2
    Dernier message: 27/05/2007, 22h23
  4. Nombre aléatoire sans doublon
    Par Ardely dans le forum Delphi
    Réponses: 9
    Dernier message: 01/03/2007, 21h54
  5. Réponses: 13
    Dernier message: 08/12/2006, 10h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo