[Math]Petit problème de math à résoudre en java
Bonjour à tous,
On m'a soumis ce problème de math : dans une usine, les ouvriers travaillent toute l'année, sauf quand c'est l'anniversaire de l'un d'eux. Combien d'ouvriers faut-il embaucher pour maximiser la production ?
Mathématiquement, je trouve 364 ouvriers. Mais j'avais envie de vérifier ça et comme je me suis mis au java, je me suis dit : vérifions tout cela avec un petit programme java.
Malheureusement le programme indiquait une maximisation pour 365. Je me suis dit, c'est louche. Testons avec des chiffres simples : une année de deux jours, deux ouvriers. Il y a une chance sur deux pour qu'ils aient leur anniversaire le même jour, et qu'ils travaillent donc chacun une journée, et une chance sur deux pour qu'ils ne fassent rien de l'année. Donc l'espérance mathématique du nombre de journées travaillées et de 1. Le programme ci-dessous donne ~ 1,15... (faux résultat, donc). Je ne comprends pas pourquoi.
Code:
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
| import java.util.Random;
class probleme_de_math {
public static void main(String[] args) {
final long ITERATIONS = 100000; // à réduire si on travaille avec une année de 365 jours
final int JOURS_ANNEE = 2; // 365, par exemple
final int MIN_OUVRIERS = 2; // 300, par exemple
final int MAX_OUVRIERS = 2; // 400, par exemple
int i, k; long j; // compteurs
// jours_chomes[] prend la valeur 1 quand le jour est chômé et 0 s'il est travaillé
// Par exemple, jours_chomes[4] = 1 signifie que le 5ème jour de l'année est chômé
int jours_chomes[] = new int[JOURS_ANNEE];
// Boucle sur les ouvriers...
for (i = 0; i <= MAX_OUVRIERS - MIN_OUVRIERS; i++) {
// Cette variable donne l'espérance mathématique du volume total de jours travaillés
double moy_jours_travailles_tous_ouvriers = 0;
for (j = 0; j < ITERATIONS; j++) {
// Initialisation du décompte des jours travaillés / chômés :
// Pour l'instant pas d'ouvrier, donc pas de chômage ;)
int jours_travailles_1_ouvrier = JOURS_ANNEE;
for (k = 0; k < JOURS_ANNEE; k++) {
jours_chomes[k] = 0;
}
// Chaque ouvrier chôme un jour au hasard
for (k = 0; k < MIN_OUVRIERS + i; k++) {
jours_chomes[new Random().nextInt(JOURS_ANNEE)] = 1;
}
// On obtient le nombre de jours travaillés en soustrayant le nombre de jours chômés au nombre de jours dans une année.
for (k = 0; k < JOURS_ANNEE; k++) {
jours_travailles_1_ouvrier = jours_travailles_1_ouvrier - jours_chomes[k];
}
// moy_jours_travailles_tous_ouvriers contient la somme des résultats de chaque itération
moy_jours_travailles_tous_ouvriers = moy_jours_travailles_tous_ouvriers + jours_travailles_1_ouvrier;
}
// Pour obtenir notre espérance mathématique, on divise par le nombre d'itérations et on multiplie par le nombre d'ouvriers.
moy_jours_travailles_tous_ouvriers = moy_jours_travailles_tous_ouvriers * (MIN_OUVRIERS + i) / ITERATIONS;
// Affichage du résultat
System.out.println(MIN_OUVRIERS + i + " ouvriers : " + moy_jours_travailles_tous_ouvriers + " jours oeuvrés");
}
}
} |
Merci d'avance pour vos éclaircissements.
++