Connaissez-vous un moyen de diviser un entier en disant ... 5 groupes. Chaque groupe total doit être au hasard, mais le total d'entre eux doit être égal à un nombre fixe.
Par exemple, j'ai "100" je veux diviser ce nombre en p> éditer : J'ai oublié de dire que oui un équilibre serait une bonne chose.Je supposons que cela puisse être fait en faisant une instruction si une instruction bloquante n'importe quel nombre au-dessus de 30 instance. P> P>
8 Réponses :
Je pense que l'astuce est de continuer à régler le plafond de votre générateur de # aléatoire à 100 - couranteTotal p>
Cette approche ne vous donnera pas une répartition particulièrement équilibrée (les premiers éléments sont susceptibles d'être beaucoup plus importants que les éléments ultérieurs, en moyenne). Mais pour être juste, l'OP n'a pas spécifié la distribution.
Cela devrait faire ce dont vous avez besoin:
<?php
$tot = 100;
$groups = 5;
$numbers = array();
for($i = 1; $i < $groups; $i++) {
$num = rand(1, $tot-($groups-$i));
$tot -= $num;
$numbers[] = $num;
}
$numbers[] = $tot;
J'ai eu tableau ([0] => 11 [1] => 48 [2] => 26 [3] => 7 [4] => 6) code>. Qui ajoute jusqu'à 98.
Whoops, fixe. Le dernier numéro n'est pas aléatoire, cependant.
Si vous souhaitez "équilibrer la distribution", vous pouvez ajouter une étape à la fin pour randomiser l'index de la matrice.
Vrai. Un appel à array_shuffle () code> sur le tableau fini serait i> Solde la distribution, mais les chiffres ne seraient toujours pas aléatoires.
Choisissez 4 numéros aléatoires, environ une moyenne de 20 (avec la distribution de par exemple, environ 40% de 20, I.E. 8). Ajoutez un cinquième numéro tel que le total est de 100. P>
En réponse à plusieurs autres réponses ici, le dernier numéro ne peut pas être aléatoire, car la somme est corrigée. Comme explication, en dessous de l'image, il n'ya que 4 points (de petites tiques) qui peuvent être choisi au hasard, représentés de manière accumulée avec chacun en ajoutant un nombre aléatoire autour de la moyenne de tous (Total / N, 20) pour avoir une somme de 100. Le résultat est de 5 espacements, représentant les 5 nombres aléatoires que vous recherchez. P>
p>
@Sandro Antonucci: Il suffit de mieux adapter mon explication et a vu que votre exemple 20,3,34,15,18 ne s'ajoute pas jusqu'à 100. Mais c'est ce que vous voulez dire, non? (a eu un bowvote sur ma réponse précédente et je me demandais pourquoi)
$number = 100;
$numbers = array();
$iteration = 0;
while($number > 0 && $iteration < 5) {
$sub_number = rand(1,$number);
if (in_array($sub_number, $numbers)) {
continue;
}
$iteration++;
$number -= $sub_number;
$numbers[] = $sub_number;
}
if ($number != 0) {
$numbers[] = $number;
}
print_r($numbers);
Cela semble correct, le problème est que si un numéro est élevé, il réduira mathématiquement le total des "groupes" atteignant le total tôt. Comment dire au script de "continuer à essayer" un nombre aléatoire jusqu'à ce qu'il soit inférieur à 30, par exemple?
si ($ sub_number <= 30) {$ itération ++; $ Numéro - = $ sub_number; $ numéros [] = $ sub_number; } code> Ajout de ces travaux mais le dernier numéro pourrait devenir énorme
Ça va exploser si votre premier numéro est de 95 ou plus. 95,1,2,?,?,? Si aucune répétition n'est autorisée, ou 99,1,?,?,? si ils sont.
Selon votre aléatoire, vous en avez besoin et comment les ressources riches sont l'environnement que vous envisagez d'exécuter le script, vous pouvez essayer l'approche suivante.
[root@server ~]# php /var/www/dev/test.php
array(5) {
[0]=>
int(11)
[1]=>
int(2)
[2]=>
int(13)
[3]=>
int(9)
[4]=>
int(65)
}
[root@server ~]# php /var/www/dev/test.php
array(5) {
[0]=>
int(9)
[1]=>
int(29)
[2]=>
int(21)
[3]=>
int(27)
[4]=>
int(14)
}
[root@server ~]# php /var/www/dev/test.php
array(5) {
[0]=>
int(18)
[1]=>
int(26)
[2]=>
int(2)
[3]=>
int(5)
[4]=>
int(49)
}
[root@server ~]# php /var/www/dev/test.php
array(5) {
[0]=>
int(20)
[1]=>
int(25)
[2]=>
int(27)
[3]=>
int(26)
[4]=>
int(2)
}
[root@server ~]# php /var/www/dev/test.php
array(5) {
[0]=>
int(9)
[1]=>
int(18)
[2]=>
int(56)
[3]=>
int(12)
[4]=>
int(5)
}
[root@server ~]# php /var/www/dev/test.php
array(5) {
[0]=>
int(0)
[1]=>
int(50)
[2]=>
int(25)
[3]=>
int(17)
[4]=>
int(8)
}
[root@server ~]# php /var/www/dev/test.php
array(5) {
[0]=>
int(17)
[1]=>
int(43)
[2]=>
int(20)
[3]=>
int(3)
[4]=>
int(17)
}
Bonjour, pouvez-vous expliquer pourquoi à l'intérieur de la condition si vous mettez $ groupe = 0? Je ne peux pas comprendre l'utilisation
Je crois que j'ai compris. C'est fait pour trouver un dernier numéro pour atteindre le total, non? Très intelligent :)
La solution que j'ai trouvée à ce problème est un peu différente mais fait plus de sens pour moi, donc dans cet exemple, je génère une gamme de nombres qui ajoutent jusqu'à 960. J'espère que c'est utile.
La solution dépend de la façon dont aléatoire em> vous voulez que vos valeurs soient, en d'autres termes, quelle situation aléatoire vous allez simuler. Pour obtenir une distribution totalement aléatoire, vous aurez Pour faire 100 sondages dans lesquels chaque élément sera lié à un groupe, en langage symbolique p> pour plus grand nombre, vous pouvez augmenter le groupe sélectionné par Cependant, vous voulez obtenir la balance, donc je pense que le meilleur pour vous serait la distribution normale . Dessinez 5 valeurs gaussiennes, qui diviseront le nombre (leur somme) en 5 parties. Maintenant, vous devez mettre à l'échelle de ces pièces afin que leur somme soit N et autour de eux, vous avez donc eu vos 5 groupes. P> P> aléatoire (1 , n / 100) code> ou quelque chose comme ça jusqu'à ce que la somme totale correspond au n. p>
J'ai une approche légèrement différente de certaines des réponses ici. Je crée un pourcentage en vrac basé sur le nombre d'éléments que vous souhaitez résumer, puis plus ou moins 10% sur une base aléatoire.
i alors faire ce n-1 fois (n est total d'itérations), donc vous avez donc un reste. Le reste est alors le dernier numéro, qui n'est pas lui-même bruléy aléatoire, mais il est basé sur d'autres nombres aléatoires. P>
fonctionne assez bien. P>
Total: 500
Array
(
[0] => 167
[1] => 164
[2] => 169
)
C'est possible. Avez-vous fait des tentatives?
Dans quelle partie de cela avez-vous des problèmes? Savez-vous comment générer des nombres aléatoires?
Je ne vais pas faire vos devoirs pour vous, mais je commencerais à générer un nombre aléatoire compris entre 1 et 100 - (5-1) si vous voulez 5 groupes.
Cela ne semble pas un problème sur PHP?