Pourquoi les nombres Excel RANDBETWEEN changent-ils pour toute opération sur la feuille de calcul?


14

Je dois utiliser la fonction RANDBETWEEN de Microsoft Excel et je suis conscient qu'un nouvel ensemble de nombres aléatoires est généré chaque fois que vous faites quoi que ce soit d'autre sur la feuille de calcul. Je suis également conscient des solutions de contournement pour "geler" un ensemble de nombres aléatoires qui a été généré, par exemple, pour trier n listes de nombres aléatoires entre a et b. Ma question est la suivante: POURQUOI les nombres aléatoires générés changent-ils? Y a-t-il quelque chose dans l'algorithme qui nécessite cela? FWIW, Google Sheets, LibreOffice Calc, Apple Numbers présentent tous le même comportement.


Questions avec "Pourquoi ...?" sont souvent hors sujet ici car probablement seul l'auteur pourrait donner une réponse définitive. Votre question ne contient pas la fonctionnalité souhaitée, il est donc difficile de vous suggérer quoi que ce soit.
Máté Juhász

2
@ MátéJuhász Il semble que les réponses données montrent que ce n'est pas difficile ...
Solar Mike

Pas une réponse, mais voici quelques solutions de contournement pour ceux qui en ont besoin: stackoverflow.com/questions/8011032/…
Adam

Réponses:


28

Charles Williams a une bonne explication de la façon dont Excel calcule les choses et pourquoi.

http://www.decisionmodels.com/calcsecretsi.htm

En substance, si un classeur contient des fonctions volatiles (reportez-vous à la liste de Charles, car ce qu'est une fonction volatile a changé au fil des ans avec différentes versions d'Excel), un recalcul complet du classeur sera déclenché lorsqu'une cellule du classeur est modifiée (si Excel est réglé sur calcul automatique). S'il n'y a aucune fonction volatile dans le classeur, seules les cellules affectées par la dernière modification seront recalculées.

D'autres ici ont déclaré que le calcul automatique calculera toujours tout dans le classeur lorsqu'une cellule est modifiée, mais c'est faux. Seules les fonctions volatiles provoquent le recalcul automatique de toutes les cellules du classeur. Sans fonctions volatiles, Excel recalcule uniquement ce qui doit être recalculé.

C'est pourquoi des gens comme moi, qui connaissent la différence, conseillent fortement d'éviter les fonctions volatiles comme OFFSET () ou INDIRECT () dans les cellules de la feuille de calcul si possible, car le lactosérum ralentira le classeur en provoquant un recalcul complet après chaque changement de cellule. Apprendre à utiliser INDEX () au lieu de OFFSET () peut entraîner des améliorations spectaculaires de la vitesse, car Index n'est pas volatile (voir l'article de Charles pour plus de détails).

Le moteur de calcul d'Excel est basé sur la philosophie «recalculer ou mourir» qui distingue Excel des produits concurrents lors de son développement. Consultez cet article: https://www.geekwire.com/2015/recalc-or-die-30-years-later-microsoft-excel-1-0-vets-recount-a-project-that-defied-the -chances/


3
Bien sûr, si la "fonction volatile" est définie correctement, il ne devrait pas y avoir de différence visible entre tout recalculer et recalculer uniquement ce qui est nécessaire, à l'exception de la vitesse.
hobbs

12

D'autres réponses se concentrent sur la mécanique du recalcul et le rôle des fonctions volatiles, mais je pense que cela manque une partie de l'essentiel de la question. Il aborde les règles qui ont été utilisées mais pas tant le "pourquoi". Je vais me concentrer là-dessus.

Concept design

Permettez-moi de commencer par un concept de conception et les blocs de construction de la plupart des feuilles de calcul modernes. Il y a une "division des responsabilités". Les fonctions sont des routines dédiées qui effectuent une tâche spécifique et le font chaque fois qu'on leur demande. Indépendamment de cela, l'application de feuille de calcul contrôle quand on lui demande.

Les fonctions elles-mêmes ne contiennent aucune logique pour choisir de recalculer ou de ne pas recalculer. La nature de toutes les fonctions Excel est d'effectuer un certain type d'opération chaque fois qu'elles sont déclenchées. Aucune fonction n'a sa propre "mémoire" de sa valeur actuelle, ou un historique de ses calculs passés. Il n'a aucun moyen de savoir si c'est la première fois qu'on lui demande de faire son travail. Aucune fonction native n'a donc la capacité de s'exécuter qu'une seule fois. Si une fonction est recalculée, elle fera ce pour quoi elle est conçue et produira une nouvelle valeur.

L'application de feuille de calcul contient une certaine intelligence qui lui permet de gagner du temps en évitant les recalculs inutiles (comme décrit dans la réponse de teylyn). La seule fois où le recalcul est ignoré, c'est si l'application sait que la valeur de la fonction n'a pas été affectée par les modifications de la feuille de calcul qui ont déclenché la nécessité de recalculer les choses.

Et si vous avez besoin d'exécuter une fonction une fois, puis de conserver sa valeur? Prenez votre exemple de produire un nombre aléatoire et de ne pas modifier le résultat. Cela décrit la création de constantes générées de manière aléatoire, et vous pouvez le faire avec Excel.

Excel ne peut pas savoir comment vous souhaitez utiliser ses capacités; si vous souhaitez continuer à produire de nouvelles valeurs ou conserver le dernier ensemble. Chaque option est un cas d'utilisation pris en charge par Excel. Excel prend en charge les deux cas en vous donnant les outils pour calculer de nouvelles valeurs et les outils pour conserver les anciennes valeurs. Vous pouvez construire ce que vous voulez. Mais l'utilisateur a la responsabilité de lui faire faire ce qu'il veut.

Logique de fonction

Regardons donc la logique de ce que fait la fonction. Cela pourrait-il être logique que la logique de recalcul ignore une fonction aléatoire car sa valeur ne devrait pas être affectée par d'autres modifications dans la feuille de calcul?

Le fait que la valeur d'une fonction change ou non lors du recalcul dépend de son objectif et de sa base. Un calcul sur des valeurs constantes produira toujours le même résultat. Une opération basée sur des valeurs de cellule qui n'ont pas changé produira le même résultat.

Cependant, certaines fonctions sont conçues avec l'intention et le but de produire un résultat différent à chaque fois. Prenons par exemple les fonctions basées sur l'heure actuelle. Ils produiront un nouveau résultat basé sur le temps de recalcul. Vous ne pouvez pas avoir une fonction dont le but est de produire une valeur basée sur l'heure actuelle et de ne pas la mettre à jour lors du recalcul.

L'objectif du contrôle de recalcul est de toujours faire en sorte que tout reflète l'état actuel des choses lorsque le recalcul est déclenché. Ce critère ne serait pas rempli si les fonctions basées sur l'heure actuelle n'étaient pas mises à jour.

Les fonctions "aléatoires", comme RANDBETWEEN, ont pour but de produire un nouveau nombre aléatoire lors du recalcul. C'est ce qu'ils sont censés faire. Vous pourriez faire valoir que le recalcul pourrait être ignoré car la valeur ne devrait pas être affectée par d'autres choses se produisant sur la feuille de calcul.

Si tel était le comportement par défaut, vous mettriez à jour la feuille de calcul, mais la valeur aléatoire resterait constante. Ce n'est pas un comportement très aléatoire. Cela prendrait en charge un cas d'utilisation mais pas l'autre. Pour en revenir au concept de base, il est géré comme n'importe quelle autre fonction. Le comportement par défaut consiste à demander à Excel de le recalculer. Si vous souhaitez conserver la valeur précédente pour votre cas d'utilisation, c'est à vous de le faire avec les outils disponibles.


Cette belle explication, tout en me rapprochant de la réponse que je cherche, ne me laisse pas convaincue. J'essaie de générer 25 nombres aléatoires entre 1 et 365; J'ai besoin de le faire VINGT FOIS (oui, c'est une simulation du problème d'anniversaire "classique"). Une fois que j'ai généré un ensemble de 25 nombres aléatoires, je voudrais qu'ils le gèlent (1) pendant que je génère les autres ensembles de 25, et (2) afin de pouvoir trier les 20 ensembles que je viens de générer. Je peux le faire en utilisant les solutions de contournement suggérées par d'autres ici, mais c'est tout à fait une corvée à transmettre à de nombreux étudiants qui étudient les statistiques élémentaires.
nowradioguy

3
@nowradioguy, de quelle partie n'êtes-vous pas convaincu? Excel fonctionne d'une certaine manière et nous sommes en quelque sorte coincés avec ses capacités et sa conception. Pour vos besoins, la préservation des résultats est assez simple, il suffit de le faire plusieurs fois. Si les nombres sont dans une colonne, sélectionnez et copiez l'ensemble de 25 en une seule étape, puis collez des valeurs spéciales dans une cellule à un autre endroit. Ce n'est que quelques clics, probablement le moyen le plus rapide de le faire. La pâte déclenchera probablement un recalcul, vous êtes donc prêt à répéter. Vous pouvez faire 20 sets en quelques minutes. Alors amusez-vous avec. :-)
fixer1234

2

Chaque modification de la feuille de calcul lance le recalcul automatique de toutes les formules, ce qui est le comportement par défaut.

Vous pouvez le désactiver ou geler la valeur réelle en la convertissant en valeur pure (comme l'opposé d'une formule).


1
Je comprends cela, mais sauriez-vous par hasard POURQUOI? Il n'y a rien d'évident sur la raison pour laquelle un nombre aléatoire généré dans une cellule particulière serait affecté par une opération effectuée ailleurs sur cette feuille de calcul.
nowradioguy

3
Comment Excel saurait-il à l'avance si vous voulez une valeur aléatoire "à vie" ou si vous voulez la changer fréquemment? Le deuxième cas est le plus probable (comme dans le cas contraire, vous pouvez taper la valeur aléatoire directement dans la cellule).
MarianD

Votre déclaration est fausse. Le recalcul automatique ne provoque PAS le recalcul de toutes les formules. Uniquement lorsque le classeur a des fonctions volatiles.
teylyn

1

Elle est classée comme une formule «volatile» et fait donc partie de la liste des fonctions recalculées lorsqu'un changement est détecté ou qu'une nouvelle fonction est entrée.

Une autre option à considérer est de basculer la feuille en calcul manuel afin de contrôler quand cela se produit - assurez-vous simplement de vous souvenir de recalculer, car toute modification des valeurs ou des formules ne provoquera pas de recalcul ...


J'ai essayé Google "formule volatile", et un certain nombre de liens apparaissent expliquant ce qui est sur la liste des formules "volatiles", mais nulle part je ne peux trouver d'explication POURQUOI RANDBETWEEN est - ou doit être - une formule volatile .
nowradioguy

1
On pourrait supposer parce qu'il est "aléatoire", il est donc logique qu'il recalcule à chaque fois ... Comme indiqué si vous voulez que votre nombre aléatoire soit fixe, vous avez 2 méthodes différentes - ce qui signifie qu'il ne changera plus. Quelques bonnes informations ici: decisionmodels.com/calcsecretsi.htm
Solar Mike

Oui merci; c'est l'un des résultats de ma recherche Google, mais il ne répond pas directement à ma question. Pensez-y: si je fais une opération non liée dans une autre cellule, et qu'un calcul s'ensuit, alors tous les nombres aléatoires précédemment générés sont générés à nouveau et sont modifiés. Ça n'a pas de sens pour moi.
nowradioguy

Excel recalcule les valeurs des cellules lorsqu'un événement déclenche ce processus, randbetween est classé comme volatile (j'ai fait une feuille de dés pour ma fille, donc il est recalculé chaque fois que je frappe F9 ...) donc il est recalculé, voir ici aussi: beatexcel.com/ fonctions-volatiles-excel . Si vous voulez qu'un nombre précédemment aléatoire cesse de changer, il existe deux méthodes pour y parvenir.
Solar Mike

@ fixer1234 PAS TOUT est volatile. Toutes les formules ne sont pas réévaluées lorsque quelque chose change sur une feuille de calcul. Cela se produit uniquement si le classeur contient des formules volatiles. Si vous ne disposez que de Sum () ou Countif () ou d'autres, il recalculera uniquement les cellules affectées par une modification, PAS le classeur Wole.
teylyn

0

Malgré les efforts héroïques pour faire de ce son une fonctionnalité et non un bug, je trouve extrêmement peu probable que ce comportement soit systématiquement avantageux. Les "fonctionnalités" nous facilitent la vie, les "bugs" le rendent plus difficile. Dans mon cas, la saisie d'une étiquette ou d'une explication dans une cellule qui n'est référencée par aucune autre cellule entraîne une re-randomisation qui n'est pas pratique à gérer. J'appellerais cela un "bug".

Oui, je peux contrôler le recalcul manuellement (une douleur) ou je peux coller des valeurs pour l'empêcher (encore une fois, une douleur), mais dans quels cas la re-randomisation causée par la saisie de texte dans une région éloignée de la feuille facilite-t-elle la vie?

Même s'il y a une certaine logique derrière la gestion des fonctions "volatiles", il semblerait trivialement facile de déclencher un nouveau calcul via des critères appropriés autres que de simplement appuyer sur "entrer" après la saisie de texte dans des cellules non liées et non référencées, ou par d'autres modifications complètement indépendantes. Empêcher cela devrait être la valeur par défaut et je ne peux pas imaginer que ce serait difficile à mettre en œuvre. Si quelqu'un veut cette "fonctionnalité", il peut l'activer, mais je ne peux pas imaginer quand ce serait une bonne chose. Au mieux, il pourrait être relativement inoffensif. Pour moi, c'est un gros problème en raison du type de feuille que je crée.

Enfin - Analysis Toolpak vous permet de créer des distributions de nombres aléatoires de diverses manières, et les plages de nombres ainsi créées ne recalculent pas (re-randomisent) du tout, sauf si vous le lui demandez. Je recommande donc aux utilisateurs d'utiliser Analysis ToolPak lorsqu'il répond à leurs besoins.


Bienvenue dans Super User. Le site est une base de connaissances de solutions, donc les messages de réponse doivent se concentrer sur les réponses à ce qui a été demandé dans la question. Presque l'intégralité de votre message est vraiment une diatribe, une opinion et un commentaire, ce qui est susceptible d'attirer des votes négatifs car il n'est pas productif dans le cadre du site. Votre dernier paragraphe pourrait être prometteur. Pensez à supprimer tout le reste et développez le dernier paragraphe pour inclure davantage le "comment", peut-être un exemple. Pour les débutants d'Excel, il serait également utile de mentionner comment charger ce toolpak.
fixer1234
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.