08 Fév 2017 à 14:23
08 Fév 2017 à 14:36
08 Fév 2017 à 20:10
#include <stdio.h>
#include <stdlib.h>
// gcc -Wall generator.c -o generator
//test : ./generator 56.2 7 3.2
int rand_a_b(int a, int b){
if(a>=b)
{
fprintf(stderr,"etourdi va!\n");
}
return rand()%(b-a) +a;
}
int main(int argc, char * argv[])
{
float total;
float min;
int nb;
float *tab;
float accumulateur;
int i;
if(argc != 4)
{
fprintf(stderr,"%s total min nb\n",argv[0]);
exit(1);
}
total = atof(argv[1]);
min = atof(argv[2]);
nb = atof(argv[2]);
tab = (float*)malloc(sizeof(float)*nb);
while(1)
{
accumulateur =0;
for(i=0;i<nb-1;i++)
{
tab[i] = (float)(rand_a_b((int)(min*1000),(int)(total*1000)));
tab[i] =tab[i] / (float)1000;
accumulateur+=tab[i];
if(accumulateur > total)
break;
}
if(accumulateur < total)
if((total -accumulateur) >min)
{
tab[nb-1] = total-accumulateur;
break;
}
}
printf("La solution est :");
for(i= 0;i<nb;i++)
printf(", %f",tab[i]);
printf("\n");
}
./generator 56.2 7 3.2
La solution est :, 7.698000, 7.854000, 7.886000, 7.017000, 9.698000, 7.726000, 8.321003
08 Fév 2017 à 20:16
08 Fév 2017 à 20:20
08 Fév 2017 à 20:39
C'est typique : ça a l'air inintelligible, super costaud, inspire le respect ...
... jusqu'au moment où tu examine le résultat, et là tu t'aperçois que ça ne fait pas le job demandé
08 Fév 2017 à 20:43
08 Fév 2017 à 21:10
shal » 08 Fév 2017, 19:20 a écrit:c'est du langage C .
Très vieux (il date des années 70) mais encore très utilisé (notamment pour tout ce qui est proche du matériel)
https://fr.wikipedia.org/wiki/C_(langage)
09 Fév 2017 à 15:57
09 Fév 2017 à 19:44
PP_65 » 08 Fév 2017, 20:10 a écrit:
OK, j'en ai seulement entendu parler, n'en ayant pratiqué aucun, je ne vais pas le déchiffrer ; par contre
si on prends 100 comme somme à atteindre, 5 comme nombres aléatoires dont le total va donner 100 , le cinquième qui est donc 100-la somme des quatre autres n'est plus aléatoire . Donc tu demanderais 1 premier nombre compris strictement entre 0 et 100 , puis un second tel que la somme des deux premiers ne dépasse pas 100, et ainsi de suite jusqu'au 4 ème ; c'est ça ?
Ou alors , si 11 est le premier qui sort , tu demandes un nombre aléatoire entre 0 et 89 , et ainsi de suite ?
09 Fév 2017 à 19:49
09 Fév 2017 à 19:52
09 Fév 2017 à 19:53
09 Fév 2017 à 20:00
#include <stdio.h>
int main()
{
printf("Hello World, the green!\n");
}
09 Fév 2017 à 20:02
09 Fév 2017 à 20:15
shal » 09 Fév 2017, 19:00 a écrit:Spécial dédicace pour André :un programme classique et vintage a la fois :
09 Fév 2017 à 20:18
Hollow » 09 Fév 2017, 19:02 a écrit:Une simple boucle qui détermine un nombre aléatoire entre min et total-(total déjà atteint)-(nombre restant)*minium...
Le dernier est calculé et basta.
Exemple 100 10 5, le premier entre 5 et 55, si 7 sort, le second entre 5 et (100-7-40) 53 et ainsi de suite.
a+
accumulateur =0;
for(i=0;i<nb-1;i++)
{
tab[i] = (float)(rand_a_b(min,total-accumulateur-((nb-1-i)*min)));
tab[i] =tab[i];
accumulateur+=tab[i];
}
tab[nb-1] = total-accumulateur;
09 Fév 2017 à 20:42
10 Fév 2017 à 19:03
zeroundemi » 08 Fév 2017, 13:36 a écrit:Voici ce que j'ai compris :
. Tu veux générer N nombres aléatoires
. La somme de ces N nombres doit être égale à T
. Le plus petit de ces N nombres doit être supérieur ou égal à m
. T et m sont paramétrables par pas de 0,1
La solution consiste à générer les nombres aléatoires dans l'intervalle [m,2*T/N-m] par la fonction EXCEL suivante :
+2*(T/N-m)*ALEA()+m
T > 0
m >= 0
T doit être plus grand que m * N
Il n'y aura pas de résultat exact
Faire plusieurs essais successifs jusqu'à obtenir une série de N nombres dont le total approche d'assez près T
10 Fév 2017 à 19:21