Génération aléatoire de nombres décimaux

Tout ce qui concerne l'utilisation ou l'installation de LaTeX.

Modérateur: gdm_tex

Règles du forum
Merci d'éviter le style SMS dans vos messages et de penser à utiliser la fonction Recherche avant de poster un message. Pour joindre des fichiers à vos messages, consulter ce sujet.
> Penser à utiliser les balises Code pour poster du code.

Re: Génération aléatoire de nombres décimaux

Messagepar chris_wafer » Samedi 23 Août 2014, 13:34

En fait presque parfait car je veux faire ça sur deux pages.
Une page où il y a le calcul et une deuxième page où il y a le résultat.

Merci d'avance pour votre aide.
chris_wafer
Déca-utilisateur
 
Messages: 25
Inscription: Mardi 06 Février 2007, 22:46

Publicité

Re: Génération aléatoire de nombres décimaux

Messagepar pg » Samedi 23 Août 2014, 14:19

Où est le problème ? Il suffit de mettre la partie avec

Code: Tout sélectionner
\pgfkeys{/pgf/number format/.cd,fixed,precision=0}
 \pgfmathparse{\randomone*\randomtwo}\pgfmathprintnumber{\pgfmathresult}

à l'endroit où on veut le résultat, que ce soit juste après ou sur une autre page ne change rien (à condition de s'assurer que les noms \randomone et \randomtwo n'aient pas été utilisés entre temps pour d'autres calculs).
pg
Modérateur
 
Messages: 2592
Inscription: Jeudi 14 Juin 2007, 23:31

Re: Génération aléatoire de nombres décimaux

Messagepar MB » Mardi 26 Août 2014, 17:52

chris_wafer a écrit:Et que est le code avec lualatex pour faire la même chose?


Voilà un exemple de code à compiler avec lualatex.

Code: Tout sélectionner
\documentclass{article}
\usepackage{fontspec}
\usepackage{luatextra}
\usepackage{unicode-math}

\newcommand{\randomint}[3][randomint]{\luaexec{#1=math.random(#2,#3);tex.print(#1)}}
\newcommand{\randomdec}[4][randomdec]{\luaexec{local k=math.pow(10,#4);#1=math.random(#2*k,#3*k)/k;tex.print(#1)}}

\begin{document}

\begin{itemize}
\item \randomint[a]{10}{50} est un entier au hasard entre 10 et 50 stocké dans la variable lua "a".
\item \randomdec[b]{20}{30}{2} est un décimal au hasard entre 20 et 30 avec 2 chiffres dans sa partie décimale stocké dans la variable lua "b".
\item Le produit de \luaexec{tex.print(a)} par \luaexec{tex.print(b)} est \luaexec{tex.print(a*b)}.
\end{itemize}

\end{document}


lua_random.png
MB (Pas d'aide en Message Privé)
Merci d'utiliser $\LaTeX$ (voir ici) et d'éviter le style SMS pour la lisibilité des messages.
MB
Administrateur
 
Messages: 6872
Inscription: Samedi 28 Mai 2005, 13:23
Localisation: Créteil
Statut actuel: Actif et salarié | Enseignant

Re: Génération aléatoire de nombres décimaux

Messagepar chris_wafer » Mardi 26 Août 2014, 20:34

pg a écrit:Où est le problème ? Il suffit de mettre la partie avec

Code: Tout sélectionner
\pgfkeys{/pgf/number format/.cd,fixed,precision=0}
 \pgfmathparse{\randomone*\randomtwo}\pgfmathprintnumber{\pgfmathresult}


à l'endroit où on veut le résultat, que ce soit juste après ou sur une autre page ne change rien (à condition de s'assurer que les noms \randomone et \randomtwo n'aient pas été utilisés entre temps pour d'autres calculs).



Moi ça me met l'erreur suivante :

Code: Tout sélectionner
Missing \endcsname inserted.<to be read again>\randomone }


Avec le code suivant :

Code: Tout sélectionner
    % Calcul
   \begin{center}
        $\pgfkeys{/pgf/number format/.cd,fixed,precision=3}
        \randomdec[3]{-3.14}{3.14}[\randomone]
        \randomdec[3]{-3.14}{3.14}[\randomtwo]
        \pgfmathprintnumber{\randomone} \times \pgfmathprintnumber{\randomtwo} =
   \end{center}
   
                \newpage

        $\pgfkeys{/pgf/number format/.cd,fixed,precision=3}
       \pgfmathparse{\randomone*\randomtwo}\pgfmathprintnumber{\pgfmathresult}$


Où est le problème?
chris_wafer
Déca-utilisateur
 
Messages: 25
Inscription: Mardi 06 Février 2007, 22:46

Re: Génération aléatoire de nombres décimaux

Messagepar chris_wafer » Mardi 26 Août 2014, 20:50

En fait, c'est les $ qui foutaient la merde!
chris_wafer
Déca-utilisateur
 
Messages: 25
Inscription: Mardi 06 Février 2007, 22:46

Re: Génération aléatoire de nombres décimaux

Messagepar chris_wafer » Mercredi 27 Août 2014, 21:03

Bonjour,

Voilà le code que j'ai écrit :

Code: Tout sélectionner
      \foreach \x in {1,...,5}{% boucle à 5 éléments
   \newpage   
   
   % En-tete
   \begin{center}
       \textcolor{green}{Calcul ENTIER \x} \\
   
        \pgfkeys{/pgf/number format/.cd,fixed,precision=0}
      \randomint{1}{10}[\randomone]
        \randomint{1}{10}[\randomtwo]
        $\printnumberneg{\randomone} \times \printnumberneg{\randomtwo} =$
        $\pgfmathparse{\randomone*\randomtwo}\pgfmathprintnumber{\pgfmathresult}$
        
   \end{center}
}


Mais maintenant j'ai une autre problématique.
Je ne voudrais pas afficher le résultat dans la boucle "for" actuelle, juste laisser le calcul avant le "=".
Et faire une autre boucle "for" pour ré afficher le calcul mais cette fois-ci avec le résultat,

Comment faire pour tout stocker, et gérer cette problématique avec juste deux boucles "for"?

Merci d'avance pour votre aide.
sla boucle actuelle, mais créer une autre autre boucle juste après pour afficher l'ensemble des calculs avec leur résultat associé.
Si je fais bien sûr un copier/coller,
chris_wafer
Déca-utilisateur
 
Messages: 25
Inscription: Mardi 06 Février 2007, 22:46

Re: Génération aléatoire de nombres décimaux

Messagepar pg » Mercredi 27 Août 2014, 21:46

Il suffit de mettre des noms de variables uniques à chaque résultat, en les numérotant (c'est un peu texnique, car il faut passer par des \csname) :

Code: Tout sélectionner
\documentclass{article}

\usepackage{tikz}
\usepackage{xargs}

\newcommandx{\randomint}[3][3=\randomintresult]{%
  %%% syntaxe : \randomint{-3}{3}[\resultat]
  %%% nombre entier aléatoire entre #1 et #2
  %%% resultat stocké dans #3 (#3 = \randomintresult par défaut)
  \pgfmathparse{random(0,int(#2-#1))+#1}% calcul du nombre aléatoire
  \expandafter\expandafter\expandafter\global
  \expandafter\expandafter\expandafter\let#3=\pgfmathresult % stockage du résultat
  \begingroup
    %\pgfkeys{/pgf/number format/.cd,fixed,precision=0}% 0 décimales
    \pgfmathprintnumber{#3}% impression du nombre aléatoire
  \endgroup
}

% Le même avec des nombres décimaux
\newcommandx{\randomdec}[4][1=2,4=\randomdecresult]{%
  %%% syntaxe : \randomdec[0]{-3}{3}[\resultat]
  %%% nombre décimal aléatoire entre #2 et #3
  %%% avec #1 décimales (#1 = 2 par défaut)
  %%% resultat stocké dans #4 (#4 = \randomdecresult par défaut)
  \pgfmathparse{round(((#3-#2)*rnd+#2)*pow(10,#1))/pow(10,#1)}% calcul du nombre aléatoire
  \expandafter\expandafter\expandafter\global
  \expandafter\expandafter\expandafter\let#4=\pgfmathresult % stockage du résultat
  \begingroup
    \pgfkeys{/pgf/number format/.cd,fixed,precision=#1}% #1 décimales
    \pgfmathprintnumber{#4}% impression du nombre aléatoire
  \endgroup
}

\newcommand{\variable}[1]{\csname#1\endcsname}

\begin{document}

\foreach \x in {1,...,5}{% boucle à 5 éléments
   % En-tete
   \begin{center}
       \textcolor{green}{Calcul ENTIER \x} \\
   
        \pgfkeys{/pgf/number format/.cd,fixed,precision=0}
        $\randomint{1}{10}[\variable{a\x}] \times \randomint{1}{10}[\variable{b\x}] =$   
   \end{center}
}

\foreach \x in {1,...,5}{% boucle à 5 éléments
   % En-tete
   \begin{center}
       \textcolor{blue}{Resultat ENTIER \x} \\
   
        \pgfkeys{/pgf/number format/.cd,fixed,precision=0}
        $\pgfmathparse{\variable{a\x}*\variable{b\x}} \pgfmathprintnumber{\pgfmathresult}$
       
   \end{center}
}

\end{document}

Attention, dorénavant, les résultats stockées doivent s'appeler "\variable{...}" et non plus "\resultat" comme auparavant.
pg
Modérateur
 
Messages: 2592
Inscription: Jeudi 14 Juin 2007, 23:31

Re: Génération aléatoire de nombres décimaux

Messagepar chris_wafer » Vendredi 29 Août 2014, 12:40

Bonjour,

merci pour ta réponse. Le problème est que dans la 2eme boucle "for" pour les résultats j'aimerai les mêmes nombres que dans la 1ere boucle. Ce qui n'est pas le cas.

Merci
chris_wafer
Déca-utilisateur
 
Messages: 25
Inscription: Mardi 06 Février 2007, 22:46

Re: Génération aléatoire de nombres décimaux

Messagepar chris_wafer » Vendredi 29 Août 2014, 12:43

désolé, ca marche!
j'ai du changer quelques choses dans le code...
chris_wafer
Déca-utilisateur
 
Messages: 25
Inscription: Mardi 06 Février 2007, 22:46

Re: Génération aléatoire de nombres décimaux

Messagepar chris_wafer » Vendredi 29 Août 2014, 12:54

J'ai une autre question lié à l'affichage des résultats. Est-il possible de les mettre dans un tableau . Je n'ai pas trouvé comment faire avec la boucle "for".

les 10 résultats que j'aimerai mettre dans un tableau de 5 lignes et 2 colonnes

merci
chris_wafer
Déca-utilisateur
 
Messages: 25
Inscription: Mardi 06 Février 2007, 22:46

Re: Génération aléatoire de nombres décimaux

Messagepar chris_wafer » Vendredi 29 Août 2014, 13:36

j'ai fait ceci:

Code: Tout sélectionner
\begin{tabular}{|c|c|}
\hline
 \foreach \x in {1,...,5}{% boucle à 5 éléments
 
       
       \textcolor{blue}{R\x}
       \pgfkeys{/pgf/number format/.cd,fixed,precision=0}
        $\pgfmathprintnumber{\variable{a\x}} \printnumberpos{\variable{b\x}} = \pgfmathparse{\variable{a\x}+\variable{b\x}}       \pgfmathprintnumber{\pgfmathresult}$}
&     
 \foreach \x in {6,...,10}{% boucle à 5 éléments
 
       
       \textcolor{blue}{R\x}
       \pgfkeys{/pgf/number format/.cd,fixed,precision=0}
        $\pgfmathprintnumber{\variable{a\x}} \printnumberpos{\variable{b\x}} = \pgfmathparse{\variable{a\x}+\variable{b\x}}       \pgfmathprintnumber{\pgfmathresult}$}


         \\
\hline
\end{tabular}


mais je n'arrive pas à revenir à la ligne dans le tableau....
chris_wafer
Déca-utilisateur
 
Messages: 25
Inscription: Mardi 06 Février 2007, 22:46

Re: Génération aléatoire de nombres décimaux

Messagepar chris_wafer » Vendredi 29 Août 2014, 13:50

j'ai aussi fait ceci mais ce n'est pas pratique !

Code: Tout sélectionner
\begin{tabular}{|c|c|}
\hline
       \textcolor{blue}{R1}
       \pgfkeys{/pgf/number format/.cd,fixed,precision=0}
        $\pgfmathprintnumber{\variable{a1}} \printnumberpos{\variable{b1}} = \pgfmathparse{\variable{a1}+\variable{b1}}       \pgfmathprintnumber{\pgfmathresult}$ &
        \textcolor{blue}{R6}
       \pgfkeys{/pgf/number format/.cd,fixed,precision=0}
        $\pgfmathprintnumber{\variable{a6}} \printnumberpos{\variable{b6}} = \pgfmathparse{\variable{a6}+\variable{b6}}       \pgfmathprintnumber{\pgfmathresult}$ \\
\hline
\textcolor{blue}{R2}
       \pgfkeys{/pgf/number format/.cd,fixed,precision=0}
        $\pgfmathprintnumber{\variable{a2}} \printnumberpos{\variable{b2}} = \pgfmathparse{\variable{a2}+\variable{b2}}       \pgfmathprintnumber{\pgfmathresult}$ &
        \textcolor{blue}{R7}
       \pgfkeys{/pgf/number format/.cd,fixed,precision=0}
        $\pgfmathprintnumber{\variable{a7}} \printnumberpos{\variable{b7}} = \pgfmathparse{\variable{a7}+\variable{b7}}       \pgfmathprintnumber{\pgfmathresult}$ \\
\hline
\textcolor{blue}{R3}
       \pgfkeys{/pgf/number format/.cd,fixed,precision=0}
        $\pgfmathprintnumber{\variable{a3}} \printnumberpos{\variable{b3}} = \pgfmathparse{\variable{a3}+\variable{b3}}       \pgfmathprintnumber{\pgfmathresult}$ &
          \textcolor{blue}{R8}
       \pgfkeys{/pgf/number format/.cd,fixed,precision=0}
        $\pgfmathprintnumber{\variable{a8}} \printnumberpos{\variable{b8}} = \pgfmathparse{\variable{a8}+\variable{b8}}       \pgfmathprintnumber{\pgfmathresult}$ \\
\hline
\textcolor{blue}{R4}
       \pgfkeys{/pgf/number format/.cd,fixed,precision=0}
        $\pgfmathprintnumber{\variable{a4}} \printnumberpos{\variable{b4}} = \pgfmathparse{\variable{a4}+\variable{b4}}       \pgfmathprintnumber{\pgfmathresult}$ &
        \textcolor{blue}{R9}
       \pgfkeys{/pgf/number format/.cd,fixed,precision=0}
        $\pgfmathprintnumber{\variable{a9}} \printnumberpos{\variable{b9}} = \pgfmathparse{\variable{a9}+\variable{b9}}       \pgfmathprintnumber{\pgfmathresult}$ \\
\hline
\textcolor{blue}{R5}
       \pgfkeys{/pgf/number format/.cd,fixed,precision=0}
        $\pgfmathprintnumber{\variable{a5}} \printnumberpos{\variable{b5}} = \pgfmathparse{\variable{a5}+\variable{b5}}       \pgfmathprintnumber{\pgfmathresult}$ &
        \textcolor{blue}{R10}
       \pgfkeys{/pgf/number format/.cd,fixed,precision=0}
        $\pgfmathprintnumber{\variable{a10}} \printnumberpos{\variable{b10}} = \pgfmathparse{\variable{a10}+\variable{b10}}       \pgfmathprintnumber{\pgfmathresult}$ \\
\hline
\end{tabular}

chris_wafer
Déca-utilisateur
 
Messages: 25
Inscription: Mardi 06 Février 2007, 22:46

Re: Génération aléatoire de nombres décimaux

Messagepar pg » Vendredi 29 Août 2014, 14:38

Construire des tableaux à l'aide d'une boucle \foreach est un peu délicat car le corps de la boucle ne peut pas couvrir plusieurs cellules. La façon de contourner ce problème est de construire le corps du tableau dans une boucle préliminaire puis d'afficher le tableau.

Code: Tout sélectionner
\documentclass{article}

\usepackage{tikz}
\usepackage{xargs}

\newcommandx{\randomint}[3][3=\randomintresult]{%
  %%% syntaxe : \randomint{-3}{3}[\resultat]
  %%% nombre entier aléatoire entre #1 et #2
  %%% resultat stocké dans #3 (#3 = \randomintresult par défaut)
  \pgfmathparse{random(0,int(#2-#1))+#1}% calcul du nombre aléatoire
  \expandafter\expandafter\expandafter\global
  \expandafter\expandafter\expandafter\let#3=\pgfmathresult % stockage du résultat
  \begingroup
    %\pgfkeys{/pgf/number format/.cd,fixed,precision=0}% 0 décimales
    \pgfmathprintnumber{#3}% impression du nombre aléatoire
  \endgroup
}

% Le même avec des nombres décimaux
\newcommandx{\randomdec}[4][1=2,4=\randomdecresult]{%
  %%% syntaxe : \randomdec[0]{-3}{3}[\resultat]
  %%% nombre décimal aléatoire entre #2 et #3
  %%% avec #1 décimales (#1 = 2 par défaut)
  %%% resultat stocké dans #4 (#4 = \randomdecresult par défaut)
  \pgfmathparse{round(((#3-#2)*rnd+#2)*pow(10,#1))/pow(10,#1)}% calcul du nombre aléatoire
  \expandafter\expandafter\expandafter\global
  \expandafter\expandafter\expandafter\let#4=\pgfmathresult % stockage du résultat
  \begingroup
    \pgfkeys{/pgf/number format/.cd,fixed,precision=#1}% #1 décimales
    \pgfmathprintnumber{#4}% impression du nombre aléatoire
  \endgroup
}

\newcommand{\variable}[1]{\csname#1\endcsname}

\begin{document}

\def\tabularcontent{\hline}
\foreach \x in {1,...,5}{% boucle à 5 éléments
    \xdef\tabularcontent{\unexpanded\expandafter{\tabularcontent}\noexpand\gdef\noexpand\x{\x}}
    \expandafter\gdef\expandafter\tabularcontent\expandafter{\tabularcontent
    $\randomint{1}{10}[\variable{a\x}] \times \randomint{1}{10}[\variable{b\x}] =$
    &
    \pgfkeys{/pgf/number format/.cd,fixed,precision=0}
            $\pgfmathparse{\variable{a\x}*\variable{b\x}} \pgfmathprintnumber{\pgfmathresult}$
    \\
    \hline
    }
}

\begin{tabular}{|c|c|}
\tabularcontent
\end{tabular}

\end{document}
pg
Modérateur
 
Messages: 2592
Inscription: Jeudi 14 Juin 2007, 23:31

Re: Génération aléatoire de nombres décimaux

Messagepar chris_wafer » Vendredi 29 Août 2014, 21:49

Merci pour vos réponse.
j'ai encore une question:

Code: Tout sélectionner
\foreach \x in {1,2}{

\FPifeq{12}{6}
 titi
  \else
 toto
\fi

}


Sans la boucle ça compile, avec ça ne compile pas. Pourquoi?
chris_wafer
Déca-utilisateur
 
Messages: 25
Inscription: Mardi 06 Février 2007, 22:46

Re: Génération aléatoire de nombres décimaux

Messagepar pg » Samedi 30 Août 2014, 13:46

Le soucis est que \FPifeq revient à faire un \if..., mais que celui-ci est caché dans la macro, et du coup TeX ne peut le voir dans certaines situations.
Mais il n'y a pas besoin de FP pour comparer deux pauvres petits entiers :

Code: Tout sélectionner
\documentclass{article}

\usepackage{tikz}

\begin{document}

\foreach \x in {1,2}{

\ifnum\x=1
  oui
\else
  non
\fi

}

\end{document}

Alternativement, on peut utiliser tikz (qui permet de faire la plupart de ce que fait FP) :

Code: Tout sélectionner
\documentclass{article}

\usepackage{tikz}

\begin{document}

\foreach \x in {1,2}{

\pgfmathifthenelse{\x==1}{"oui"}{"non"}\pgfmathresult

}

\end{document}
pg
Modérateur
 
Messages: 2592
Inscription: Jeudi 14 Juin 2007, 23:31

Re: Génération aléatoire de nombres décimaux

Messagepar chris_wafer » Mardi 02 Septembre 2014, 20:22

En fait, j'ai un souci, lorsque je lance plusieurs compilations d'un même fichier latex dans un intervalle très court, j'obtiens toujours la liste de résultat.
Un peu comme si le randon n'était pas réinitialisé.
Y a-t-il un moyen de contourner le problème ou de le réinitailiser?

En effet, je veux générer plusieurs séries différentes sur plusieurs pdfs.

Merci.
chris_wafer
Déca-utilisateur
 
Messages: 25
Inscription: Mardi 06 Février 2007, 22:46

Re: Génération aléatoire de nombres décimaux

Messagepar pg » Mercredi 03 Septembre 2014, 15:45

La "random seed" n'est réinitialisé que toutes les minutes. Pour contourner le problème, on peut utiliser les secondes (donc la compilation doit prendre plus d'une seconde, mais de toutes façons, TeX n'a pas accès à plus court) :

Code: Tout sélectionner
\documentclass{article}

\usepackage{tikz}
\usepackage{datetime}

\pgfmathsetseed{\the\time+\the\year+\the\currentsecond}

\begin{document}

\pgfmathparse{random()}\pgfmathresult

\pgfmathparse{random()}\pgfmathresult

\end{document}
pg
Modérateur
 
Messages: 2592
Inscription: Jeudi 14 Juin 2007, 23:31

Précédente

Retourner vers LaTeX

 


  • Articles en relation
    Réponses
    Vus
    Dernier message

Qui est en ligne

Utilisateurs parcourant ce forum: Ahrefs [Bot], Google Adsense [Bot], Grapeshot [Crawler] et 30 invités