2
1

Afin de générer des nombres entiers aléatoires entre 1 et 6, je me suis inspiré d'un code proposé par un ami. D'ailleurs c'est exactement le même procédé utilisé pour générer un jet de dé sur Excel, à savoir ENT(6*ALEA()+1). Bref, le code est le suivant :

Ouvrir dans l'éditeur
\documentclass{article}
\usepackage{fp}
\expandafter\FPseed\expandafter=\pdfuniformdeviate 1000000\relax %permet de générer un nombre aléatoire à volonté. c'est à dire sans être limité par la commande \time
\usepackage{pstricks-add}

\begin{document}
    \def\nbalea{%
\FPrandom{\rand}% un nombre aléatoire entre 0 et 1 est généré. il est appelé \rand
\FPeval{\alea}{\rand*6+1} %ce nombre \rand (nouvellement appelé \alea) est évalué, est multiplié par 6 puis additionné à 1. 
\FPtrunc{\entier}{\alea}{0}% ce nombre (nouvellement appelé \entier ) est tronqué à la partie entière. NB : Je n'ai pas vu d'autre moyen pour récupérer la partie entière d'un nombre.
\edef\valeurde{\number\numexpr\entier}} % on appelle \valeurde la valeur numérique du dé

\nbalea\psdice{\valeurde}

\end{document}

En lançant, la compilation un jet de dé est simulé.

En ôtant de la dernière ligne du code définissant la macro \nbalea, \number\numexpr, j'obtiens :

Ouvrir dans l'éditeur
\edef\valeurde{\entier}

Et je constate qu'un nombre aléatoire est quand même généré. Ma question : à quoi servent exactement \number et \numexpr ? Et pourquoi \edef ?

Posée 17 Déc '15, 05:08

floyd973's gravatar image

floyd973
121715
Taux d'acceptation : 0%

Modifiée 17 Déc '15, 20:54

unbonpetit's gravatar image

unbonpetit ♦♦
1.8k18

@unbonpetit : ECM ok. J'avais oublié les balises \begin{document} et \end{document}. Le code est compilable en l'état, mais non via le compilateur en ligne « overleaf » à cause du message d'erreur suivant :

Undefined control sequence. l.11 expandafter\FPseed\expandafter=\pdfuniformdeviate 1000000\relax

(17 Déc '15, 16:30) floyd973 floyd973's gravatar image
1

\pdfuniformdeviate est une primitive du moteur pdftex. Il est probable que le moteur utilisé par overleaf ne soit pas celui là. Je ne connais pas overleaf donc je ne peux pas en dire plus. C'est une bonne leçon à retenir : éviter si possible d'utiliser des primitives spécifiques à un moteur.

Je vous fais remarquer que \psdice n'est définie nulle part et va aussi provoquer une erreur : votre code n'est toujours pas un ECM !

Enfin, les \expandafter sont inutiles : puisque \FPseed est un compteur de TeX, le développement maximal se fait de toutes façons lors de l'assignation.

(17 Déc '15, 18:21) unbonpetit ♦♦ unbonpetit's gravatar image

@unbonpetit: En faisant un copier-coller du code dans mon éditeur et en faisant F1, la compilation fonctionne bel et bien. La macro psdice vient du package{pstricks-add}. Elle prend en argument des valeurs entre 1 et 6 afin d'afficher une face de dé correspondant à cette valeur numérique.

Ainsi, il faut juste penser à utiliser le moteur LaTeX dans le menu « configurer TeXmaker ». Du moins, pour ceux et celles qui l'utilisent. AMHA, je pense que c'est la raison pour laquelle vous obtenez un message d'erreur lors de la compilation.

(17 Déc '15, 19:18) floyd973 floyd973's gravatar image
1

Je sais me servir de pstricks, rassurez-vous. J'avais oublié de copier l'appel à pstricks-add.

(17 Déc '15, 20:15) unbonpetit ♦♦ unbonpetit's gravatar image

Tout d'abord, votre code n'est pas compilable en l'état ; ce n'est pas un ECM.

Ensuite, la ligne \FPtrunc{\entier}{\alea}{0} donne à la macro \entier un texte de remplacement constitué d'un nombre entier de 1 à 6. Ainsi, la macro \entier peut être affichée telle quelle.

La primitive \number convertit l'entier interne qui la suit en un nombre entier fait de caractères affichable (base 10 et chiffres arabes). Par exemple

Ouvrir dans l'éditeur
\number`P % affiche 80

car `P est l'entier 80 (le charcode de la lettre P) dans les cas où TeX attend de lire un nombre entier.

Enfin, la primitive de eTeX \numexpr convertit une enchainement d'opérations arithmétiques en un entier interne, c'est pourquoi elle doit être précédée de \number si on veut afficher le résultat ou le stocker dans une macro avec \edef. Par exemple,

Ouvrir dans l'éditeur
\number\numexpr3*(1+2*4)-5 % affiche 22

Dans votre code, \numexpr est inutile car il n'y a aucune opération à effectuer.

Le code de votre macro \nbalea aurait pu être

Ouvrir dans l'éditeur
\def\nbalea{\FPeval{\valeurde}{trunc(random*6+1,0)}}

Dernier truc : vous avez un espace parasite dans votre macro : } doit être immédiatement suivie de % sans quoi l'espace entre les deux est pris en compte.

Lien permanent

Publiée 17 Déc '15, 09:04

unbonpetit's gravatar image

unbonpetit ♦♦
1.8k18
Taux d'acceptation : 68%

Modifiée 17 Déc '15, 09:09

Merci beaucoup pour ces réponses très pertinentes. C'est vrai que je me suis compliqué la vie avec mon petit bout de code très scolaire. Mais bon, je suis novice en informatique. D'ailleurs, il va falloir que je me familiarise avec tout ce jargon informatique.

Concernant \edef, j'ai lu ceci dans TeX pour l'impatient, en page 260 :

« Cette commande définit une macro de la même manière générale que def. La différence est que TeX développe le texte de remplacement d’un edef immédiatement (mais sans rien exécuter). »

Je ne suis pas sûr d'avoir bien compris.

(17 Déc '15, 17:10) floyd973 floyd973's gravatar image
1

Je ne me risquerais certainement pas à expliquer la différence entre exécution et développement dans un commentaire : il manque de la place.

(17 Déc '15, 18:17) unbonpetit ♦♦ unbonpetit's gravatar image

Votre nombre aléatoire \rand et l'entier qui lui correspond \pe sont générés une seule fois au début du document. Ensuite, votre macro \valeur ne fait que recracher en plusieurs endroits cette même valeur \pe. Il n'y a rien d'anormal.

Il s'agit ici d'une question de programmation, vous devriez ouvrir une nouvelle question pour ça.

Ouvrir dans l'éditeur
\documentclass{article}
\usepackage{fp,pstricks-add}
\FPseed\time
\newcommand*\lancer{\FPeval\valeurde{trunc(random*6+1,0)}\psdice\valeurde}
\begin{document}
\lancer \hfill \lancer \hfill \lancer
\end{document}

Par ailleurs, vous devriez aussi accepter une réponse, ne serait-ce que pour reconnaître le travail de ceux qui vous répondre et pour ne pas les décourager de le faire à l'avenir.

Lien permanent

Publiée 18 Déc '15, 08:13

unbonpetit's gravatar image

unbonpetit ♦♦
1.8k18
Taux d'acceptation : 68%

Modifiée 18 Déc '15, 08:25

Bonjour et merci encore. Croyez moi, j'ai bien validé votre proposition. Je vous le garanti.c'est juste que je m' essaie a plusieurs macros pour comprendre leurs comportements. Cela me permet d'élargir modestement mes connaissances et de solliciter un peu moins les maîtres qui donnent de leur temps pour aider les gens comme moi. Parfois, on est tête dans le guidon et on ne voit pas les évidences. Je ferais plus attention la prochaine fois. Et puis, j attends impatiemment l arrivée d un livre de 580 pages' qui j espère me rendra un peu plus autonome. MERCI ENCORE !!

(18 Déc '15, 11:39) floyd973 floyd973's gravatar image

À noter qu'il existe un package permettant de d'obtenir des nombres aléatoire, lcg:

Ouvrir dans l'éditeur
\documentclass{article}
\usepackage[first=1, last=6]{lcg}
\newcommand{\dice}{\rand\arabic{rand}}

\begin{document}

Trois nombres entre 1 et 6: \dice{}  \dice{}  \dice{}

\end{document}
Lien permanent

Publiée 17 Déc '15, 12:49

the_alf's gravatar image

the_alf
5864
Taux d'acceptation : 27%

Oui oui ! Effectivement je l'utilise déjà. En ce moment, j'essaie juste d'aller un peu plus loin pour comprendre le rôle de certaines primitives TeX.

(17 Déc '15, 16:37) floyd973 floyd973's gravatar image

Lorsque je fais appel plusieurs fois à un nombre aléatoire par l'intermédiaire de \FPrandom, il semblerait que ce dernier ne permette pas de générer plusieurs nombres aléatoires différents dans un même source.

Il vaut mieux compiler ce code sur sa propre machine pour comprendre ce que je décris :

Ouvrir dans l'éditeur
\documentclass{article}
\usepackage{fp}
\expandafter\FPseed\expandafter=\pdfuniformdeviate 1000000\relax %permet de générer un nombre aléatoire à volonté. c'est à dire sans être limité par la commande \time
\usepackage{pstricks-add}

\begin{document}
\FPrandom{\rand}
\FPeval{entier}{\rand*6+1}
\FPtrunc{\pe}{\entier}{0}
\newcommand{\valeur}{\pe}

\rand \hspace{\stretch{1}} \rand \hspace{\stretch{1}} \rand

\vspace{1cm}

\psdice{\pe} \hspace{\stretch{1}} \psdice{\pe} \hspace{\stretch{1}} \psdice{\pe}

\end{document}

J'ai l'impression que la valeur générée est gardée en mémoire et réutilisée à chaque appel. Par exemple, sur une casio, en allant dans le menu Ran, il suffit d'appuyer plusieurs fois sur la touche exe pour que des nombres aléatoires soient générés indépendamment les uns des autres.

Je souhaite qu'à chaque appel de \FPrandom la génération se réinitialise. Ainsi je pose ma question : existe-il un moyen de générer des nombres aléatoires indépendamment les uns des autres ?

Lien permanent

Publiée 18 Déc '15, 02:59

floyd973's gravatar image

floyd973
121715
Taux d'acceptation : 0%

Modifiée 18 Déc '15, 11:50

Pathe's gravatar image

Pathe ♦♦
7.4k29196245

Votre réponse
(dés)activer l'aperçu

Suivre cette question

Par courriel :

Une fois que vous serez enregistré, vous pourrez souscrire à n'importe quelle mise à jour ici

Par flux RSS :

Réponses

Réponses et commentaires

Bases de Markdown

  • *italique* ou _italique_
  • **gras** ou __gras__
  • Lien ::[texte](http://url.com/ "Titre ")
  • Image : ?![alt texte](/path/img.jpg "Titre ")
  • Liste numérotée : 1. Foo 2. Bar
  • Pour ajouter un passage à la ligne, ajoutez deux espaces à l'endroit où vous souhaitez que la ligne commence.
  • Les balises HTML de base sont également prises en charge.