Réponse acceptée !
Bonjour,
Une solution est de remplir le tableau avec la répartition voulue puis de mélanger les éléments du tableau :
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void Remplir
(
int *paiValeur // E/S:tableau à remplir
,int iTailleValeur // E:nombre d'éléments
,const int *paiRepartition // E:tableau des répartitions
,int iTailleRepartition // E:nombre d'éléments
)
{
// --- Remplir régulièrement
int i = 0;
for (int iRep=0 ; iRep<iTailleRepartition ; ++iRep)
for (int iVal=0 ; iVal<paiRepartition[iRep] ; ++iVal)
paiValeur[i++] = iRep;
// --- Mélanger les éléments du tableau
srand(time(NULL));
for (int iTri=0 ; iTri<iTailleValeur ; ++iTri)
{
// --- Tirer au sort les indices des 2 valeurs à permuter
int i1 = rand() % iTailleValeur;
int i2 = rand() % iTailleValeur;
if (i1 == i2) continue;
// --- Permuter les 2 valeurs
int iSwap = paiValeur[i1];
paiValeur[i1] = paiValeur[i2];
paiValeur[i2] = iSwap;
}
}
int main(void)
{
// --- Tableau des valeurs
const int iTailleValeur = 100;
int aiValeur[iTailleValeur];
// --- Tableau des répartitions demandées
// --- 13 x 0, 12 x 1, 25 x 2, 50 x 3
// --- (somme des répartitions = 'iTailleValeur')
const int iTailleRepartition = 4;
int aiRepartition[iTailleRepartition] = {13,12,25,50};
// --- Remplir et afficher
Remplir(aiValeur,iTailleValeur,aiRepartition,iTailleRepartition);
printf("\n");
for (int i=0 ; i<iTailleValeur ; ++i) printf("%d ",aiValeur[i]);
printf("\n");
return 0;
}
Ce qui donne (différent à chaque exécution) :
3 1 0 0 3 1 1 3 3 3 2 2 0 3 1 3 2 1 3 3 1 3 2 3 1
2 2 2 3 2 1 3 3 3 3 1 2 1 2 3 0 2 2 3 2 2 3 3 2 3
3 0 0 3 2 2 2 3 0 3 3 3 3 3 3 3 3 2 3 3 2 0 1 1 2
3 3 0 2 3 0 3 3 2 0 0 3 3 3 3 3 2 3 3 3 3 3 3 0 2
Jean-François