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.
Merci d'avance pour vos éclaircissements.
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 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"); } } }
++
Partager