Je veux ... euh ... "atténuer" la réponse étonnante de @ whuber, que @TomZinger dit est trop difficile à suivre. Je veux dire par là que je veux le re-décrire en des termes que je pense que Tom Zinger comprendra, car c'est clairement la meilleure réponse ici. Et au fur et à mesure que Tom utilise progressivement la méthode et découvre qu'il a besoin, par exemple, de connaître la distribution des échantillons plutôt que simplement leur moyenne, la réponse de Whuber sera exactement ce qu'il recherche.
En bref: il n'y a pas d'idées originales ici, seulement une explication plus simple.
Vous souhaitez créer des $ n $ entiers de $ 1 $ à $ 4 $ avec une moyenne $ r $ . Je vais suggérer de calculer des $ n $ entiers de $ 0 $ à $ 3 $ avec la moyenne $ r-1 $ , puis en ajoutant un à chacun d'eux. Si vous pouvez faire cette dernière chose, vous pouvez résoudre le premier problème. Par exemple, si nous voulons 10 entiers entre $ 1 $ et $ 4 $ avec une moyenne 2,6 $ ,
nous pouvons noter ces entiers $ 10 $ entre $ 0 $ et 3 $ $ ...
0,3,2,1,3,1,2,1,3,0
dont la moyenne est 1,6 $ ; si nous augmentons chacun de $ 1 $ , nous obtenons
1,4,3,2,4,2,3,2,4,1
dont la moyenne est 2,6 $ . C'est si simple.
Pensons maintenant aux nombres $ 0 $ à $ 3 $ . Je vais les considérer comme "combien d'articles ai-je dans un 'petit' ensemble?" Je n'ai peut-être aucun élément, un élément, deux éléments ou trois éléments. Donc la liste
0,3,2,1,3,1,2,1,3,0
représente dix petits ensembles différents. Le premier est vide; le second a trois éléments, et ainsi de suite. Le nombre total d'éléments dans tous les ensembles est la somme des dix nombres, c'est-à-dire 16 $ $ . Et le nombre moyen d'éléments dans chaque ensemble est ce total, divisé par 10 $ , d'où 1,6 $ .
L'idée de whuber est la suivante: supposons que vous vous fabriquiez dix petits ensembles, le nombre total d'éléments étant $ 10t $ pour un certain nombre $ t $ . Alors la taille moyenne des ensembles sera exactement $ t $ . De la même manière, si vous créez vous-même des ensembles de $ n $ avec un nombre total d'éléments étant $ nt $ span >, le nombre moyen d'éléments dans un ensemble sera $ t $ . Vous dites que vous êtes intéressé par le cas $ n = 100 $ .
Rendons ceci concret pour votre exemple: vous voulez 100 éléments entre 1 et 4 dont la moyenne est 1,9 $ . En utilisant l'idée de mon premier paragraphe, je vais changer cela en "make $ 100 $ ints entre $ 0 $ span> et 3 $ $ dont la moyenne est de 0,9 $ ". Quand j'aurai terminé, j'ajouterai $ 1 $ à chacun de mes entiers pour obtenir une solution à votre problème. Donc ma moyenne cible est $ t = 0,9 $ .
Je souhaite créer des ensembles de 100 $ $ , chacun avec entre $ 0 $ et 3 $ $ éléments dedans, avec une taille d'ensemble moyenne de 0,9 $ .
Comme je l'ai observé ci-dessus, cela signifie qu'il doit y avoir un total d'éléments 100 $ \ cdot 0.9 = 90 $ dans les décors. À partir des nombres $ 1, 2, \ ldots, 300 $ , je vais sélectionner exactement 90 $ . Je peux indiquer ceux sélectionnés en faisant une liste de 300 points et X:
..X .... X ... XX ...
où la liste ci-dessus indique que j'ai sélectionné les nombres 3, 9, 13, 14, et puis beaucoup d'autres que je n'ai pas montrés parce que j'en ai eu marre de taper. :)
Je peux prendre cette séquence de 300 points et X et la diviser en trois groupes de 100 points chacun, que j'arrange les uns sur les autres pour obtenir quelque chose qui ressemble à ceci:
... X .... X..X ..... X ...
.X ... X ..... X ... X .....
..X ... X.X..X ...... X ..
mais continue pour 100 éléments complets dans chaque ligne. Le nombre de X dans chaque ligne peut différer - il peut y en avoir 35 dans la première ligne, 24 dans la deuxième et 31 dans la troisième, par exemple, et c'est OK. [Merci à whuber d'avoir signalé que je me suis trompé dans un premier brouillon!]
Maintenant, regardez chaque colonne : chaque colonne peut être considérée comme un ensemble, et cet ensemble contient entre 0 et 3 "X". Je peux écrire les chiffres sous les lignes pour obtenir quelque chose comme ceci:
... X .... X..X ..... X ...
.X ... X ..... X ... X .....
..X ... X.X..X ...... X ..
011101102003000101100
C'est-à-dire que j'ai produit 100 nombres, chacun compris entre 1 et 3. Et la somme de ces 100 nombres doit être le nombre de X, total, dans les trois lignes, qui était de 90. La moyenne doit donc être $ 90/100 = 0.9 $ , comme vous le souhaitez.
Voici donc les étapes pour obtenir 100 entiers entre 1 et 4 dont la moyenne est exactement $ s $ .
- Soit $ t = s - 1 $ .
- Calculer $ k = 100 t $ ; c'est le nombre de X que nous placerons dans les lignes, au total.
- Faites une liste de 300 points ou X, dont $ k $ sont des X.
- Divisez-le en trois rangées de 100 points ou X, chacune contenant environ un tiers des X, plus ou moins.
- Organisez-les dans un tableau et calculez les sommes des colonnes, en obtenant 100 entiers entre $ 0 $ et $ 3 $ span >. Leur moyenne sera $ t $ .
- Ajoutez un à chaque somme de colonne pour obtenir 100 entiers entre 1 $ et 4 $ $ dont la moyenne est $ s $ .
Maintenant, la partie délicate de ceci est vraiment à l'étape 4: comment choisir des éléments $ 300 $ , $ k $ dont "X" et les autres 300-k $ dont "."? Eh bien, il s'avère que R a une fonction qui fait exactement cela.
Et puis whuber vous dit comment l'utiliser: vous écrivez
tabuler (sample.int ((k-1) * n, s-n) %% n + 1, n)
Pour votre cas particulier, $ n = 100 $ , et $ s $ , le nombre total d'éléments dans tous les petits ensembles, est $ 100r $ , et vous voulez des nombres entre $ 1 $ et 4 $ $ , donc $ k = 4 $ , donc $ k -1 $ (la plus grande taille pour un 'petit ensemble') est 3, donc cela devient
tabuler (sample.int (3 * 100, 100r-100) %% 100 + 1, n)
ou
tabuler (sample.int (3 * 100, 100 * (r-1)) %% 100 + 1, 100)
ou, en utilisant mon nom $ t $ pour $ r - 1 $ , il devient
tabuler (sample.int (3 * 100, 100 * t) %% 100 + 1, 100)
Le "+1" à la fin de sa formule originale est exactement l'étape nécessaire pour convertir des "nombres entre $ 0 $ et $ 3 $ " à "nombres entre $ 1 $ et $ 4 $ ".
Travaillons de l'intérieur et simplifions à $ n = 10 $ pour que je puisse montrer des exemples de résultats:
tabuler (sample.int (3 * 10, 10 * t) %% 10 + 1, 10)
Et visons $ t = 1.9 $ , donc cela devient
tabuler (sample.int (3 * 10, 10 * 1.9) %% 10 + 1, 10)
Commençant par sample.int (3 * 10, 10 * 1.9)
: cela produit une liste d'entiers 19 $ entre $ 1 $ et 30 $ . (c'est-à-dire que cela a résolu le problème de la sélection de $ k $ nombres sur votre total - 300 $ dans votre vrai problème, $ 30 $ dans mon petit exemple).
Comme vous vous en souviendrez, nous voulons produire trois lignes de dix points et X chacune, quelque chose comme
X.X.XX.XX.
XXXX.XXX ..
XX.X.XXX ..
Nous pouvons lire ceci de gauche à droite de haut en bas (c'est-à-dire dans l'ordre de lecture normal) pour produire une liste d'emplacements pour Xs: le premier élément est un point; les deuxième et troisième sont des X, et ainsi de suite, donc notre liste d'emplacements commence par $ 1, 3, 5, 6, \ ldots $ . Quand nous arrivons à la fin d'une ligne, nous continuons à compter, donc pour l'image ci-dessus, les emplacements X seraient $ 1, 3, 5, 6, 8, 9, 11, 12, 13, 14, 16, 17, 18, 21, 22, 24, 26, 27, 28 $ . Est-ce clair?
Eh bien, le code whubers produit exactement cette liste d'emplacements avec sa section la plus interne.
L'élément suivant est %% 10
; cela prend un nombre et produit son reste par dix. Notre liste devient donc $ 1, 3, 5, 6, 8, 9, 1, 2, 3, 4, 6, 7, 8, 1, 2, 4, 6, 7, 8 $ . Si nous divisons cela en trois groupes - ceux qui proviennent de nombres compris entre $ 1 $ et 10 $ , ceux qui proviennent de nombres de 11 $ à 20 $ , et ceux qui proviennent de nombres 21 $ à 30 $ , nous obtenons 1, 3, 5, 6 $, 8, 9 $ , puis $ 1, 2, 3, 4, 6, 7, 8, $ et enfin 1, 2, 4, 6, 7, 8 $ . Ceux-ci vous indiquent où se trouvent les X dans chacune des trois lignes. Il y a un problème subtil ici: s'il y avait eu un X en position 10 dans la première ligne, la première de nos trois listes aurait été $ 1, 3, 5, 6, 8, 9 , 0 $ , et la fonction tabuler
n'aime pas "0". Ainsi, whuber ajoute 1 à chaque élément de la liste pour obtenir 2 $, 4, 6, 7, 9, 10, 1 $ . Passons au calcul global:
tabuler (sample.int (3 * 10, 10 * 1.9) %% 10 + 1, 10)
Ceci demande "pour ces 30 $ $ nombres, chacun indiquant s'il y a un X dans une colonne, dites-moi combien de fois chaque colonne (à partir de $ 1 $ à $ 10 $ --- c'est ce que le" 10 "final vous dit) apparaît, c'est-à-dire, dites-moi combien de X sont dans chaque colonne. Le résultat est
0 3 2 2 2 1 3 2 3 1
que (à cause du décalage de un), vous devez lire comme "il n'y a pas de X dans la 10e colonne; il y a 3 X dans la première colonne; il y a 2 X dans la deuxième colonne", et ainsi de suite à "il y a un X dans la 9ème colonne".
Cela vous donne dix entiers entre $ 0 $ et 3 $ $ dont la somme est 19 $ , d'où une moyenne de 1,9 $ . Si vous augmentez chacun d'eux de 1, vous obtenez dix entiers entre 1 $ et 4 $ $ dont la somme est 29 $ , d'où une valeur moyenne de 2,9 $ .
Vous pouvez généraliser à $ n = 100 $ , j'espère.