<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/class.random-randomizer.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'fr',
  ),
  'this' => 
  array (
    0 => 'random-randomizer.getfloat.php',
    1 => 'Random\\Randomizer::getFloat',
    2 => 'Renvoie un flottant uniform&eacute;ment s&eacute;lectionn&eacute;',
  ),
  'up' => 
  array (
    0 => 'class.random-randomizer.php',
    1 => 'Random\\Randomizer',
  ),
  'prev' => 
  array (
    0 => 'random-randomizer.getbytesfromstring.php',
    1 => 'Random\\Randomizer::getBytesFromString',
  ),
  'next' => 
  array (
    0 => 'random-randomizer.getint.php',
    1 => 'Random\\Randomizer::getInt',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'fr',
    'path' => 'reference/random/random/randomizer/getfloat.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="random-randomizer.getfloat" class="refentry">
 <div class="refnamediv">
  <h1 class="refname">Random\Randomizer::getFloat</h1>
  <p class="verinfo">(PHP 8 &gt;= 8.3.0)</p><p class="refpurpose"><span class="refname">Random\Randomizer::getFloat</span> &mdash; <span class="dc-title">Renvoie un flottant uniformément sélectionné</span></p>

 </div>

 <div class="refsect1 description" id="refsect1-random-randomizer.getfloat-description">
  <h3 class="title">Description</h3>
  <div class="methodsynopsis dc-description">
   <span class="modifier">public</span> <span class="methodname"><strong>Random\Randomizer::getFloat</strong></span>(<span class="methodparam"><span class="type"><a href="language.types.float.php" class="type float">float</a></span> <code class="parameter">$min</code></span>, <span class="methodparam"><span class="type"><a href="language.types.float.php" class="type float">float</a></span> <code class="parameter">$max</code></span>, <span class="methodparam"><span class="type"><a href="enum.random-intervalboundary.php" class="type Random\IntervalBoundary">Random\IntervalBoundary</a></span> <code class="parameter">$boundary</code><span class="initializer"> = <strong><code>Random\IntervalBoundary::ClosedOpen</code></strong></span></span>): <span class="type"><a href="language.types.float.php" class="type float">float</a></span></div>

  <p class="para rdfs-comment">
   Renvoie un flottant uniformément sélectionné et équidistribué d&#039;un intervalle demandé.
  </p>
  <p class="para">
   À cause de la précision limitée, tous les nombres réels ne peuvent pas être
   exactement représentés en tant que flottants.

   Si un nombre ne peut pas être représenté exactement, il est arrondi au nombre
   exactement représentable le plus proche.

   De plus, les flottants ne sont pas également denses sur toute la ligne des nombres.

   Parce que les flottants utilisent un exposant binaire, la distance entre deux
   flottants voisins double à chaque puissance de deux.

   En d&#039;autres termes : Il y a le même nombre de flottants représentables entre
   <code class="literal">1.0</code> et <code class="literal">2.0</code>
   qu&#039;entre
   <code class="literal">2.0</code> et <code class="literal">4.0</code>,
   <code class="literal">4.0</code> et <code class="literal">8.0</code>,
   <code class="literal">8.0</code> et <code class="literal">16.0</code>,
   et ainsi de suite.
  </p>
  <p class="para">
   Sélectionner un nombre aléatoire dans un intervalle arbitraire, par exemple
   en divisant deux entiers, pourrait entraîner une distribution biaisée pour cette raison.

   L&#039;arrondi nécessaire fera que certains flottants seront retournés plus souvent que
   d&#039;autres, en particulier autour des puissances de deux lorsque la densité des flottants
   change.
  </p>
  <p class="para">
   <span class="methodname"><strong>Random\Randomizer::getFloat()</strong></span> implémente un algorithme qui
   renverra un flottant uniformément sélectionné à partir de l&#039;ensemble le plus large
   possible de flottants exactement représentables et équidistribués dans l&#039;intervalle demandé.

   La distance entre les flottants sélectionnables (« pas ») correspond à la distance
   entre les flottants avec la plus faible densité, c&#039;est-à-dire la distance entre les
   flottants aux limites de l&#039;intervalle avec la plus grande valeur absolue.

   Cela signifie que tous les flottants représentables dans un intervalle donné peuvent
   ne pas être retournés si l&#039;intervalle traverse une ou plusieurs puissances de deux.

   Le pas commencera à la limite de l&#039;intervalle avec la plus grande valeur absolue
   pour garantir que les pas s&#039;alignent avec les flottants exactement représentables.
  </p>
  <p class="para">
   Les limites d&#039;intervalle fermées seront toujours incluses dans l&#039;ensemble des flottants
   sélectionnables.

   Donc si la taille de l&#039;intervalle n&#039;est pas un multiple exact du pas et que la limite
   avec la plus petite valeur absolue est une limite fermée, la distance entre cette limite
   et son flottant le plus proche sera plus petite que le pas.
  </p>
  <div class="caution"><strong class="caution">Attention</strong>
   <p class="para">
    Le post-traitement des flottants retournés risque de casser l&#039;équidistribution uniforme,
    car les flottants intermédiaires dans une opération mathématique subissent un arrondi implicite.

    L&#039;intervalle demandé doit correspondre le plus étroitement possible à l&#039;intervalle souhaité
    et l&#039;arrondi ne doit être effectué qu&#039;en tant qu&#039;opération explicite juste avant
    d&#039;afficher le nombre sélectionné à un utilisateur.
   </p>
  </div>
  <div class="refsect2 unknown-28" id="refsect2-random-randomizer.getfloat-unknown-28">
   <h4 class="title">Explications de l&#039;algorithme en utilisant des valeurs d&#039;exemple</h4>
   <p class="para">
    Pour donner un exemple de fonctionnement de l&#039;algorithme, considérons une représentation
    en virgule flottante qui utilise une mantisse de 3 bits.

    Ceci est capable de représenter 8 valeurs flottantes
    différentes entre les puissances de deux consécutives.

    Cela signifie qu&#039;entre
    <code class="literal">1.0</code> et <code class="literal">2.0</code> tous les pas de taille <code class="literal">0.125</code>
    sont exactement représentables et entre <code class="literal">2.0</code> et <code class="literal">4.0</code>
    tous les pas de taille <code class="literal">0.25</code> sont exactement représentables.

    En réalité, les flottants de PHP utilisent une mantisse de 52 bits et peuvent représenter
    2<sup class="superscript">52</sup> valeurs différentes entre chaque puissance de deux.

    Cela signifie que
    <ul class="simplelist">
     <li><code class="literal">1.0</code></li>
     <li><code class="literal">1.125</code></li>
     <li><code class="literal">1.25</code></li>
     <li><code class="literal">1.375</code></li>
     <li><code class="literal">1.5</code></li>
     <li><code class="literal">1.625</code></li>
     <li><code class="literal">1.75</code></li>
     <li><code class="literal">1.875</code></li>
     <li><code class="literal">2.0</code></li>
     <li><code class="literal">2.25</code></li>
     <li><code class="literal">2.5</code></li>
     <li><code class="literal">2.75</code></li>
     <li><code class="literal">3.0</code></li>
     <li><code class="literal">3.25</code></li>
     <li><code class="literal">3.5</code></li>
     <li><code class="literal">3.75</code></li>
     <li><code class="literal">4.0</code></li>
    </ul>
    sont les flottants exactement représentables entre
    <code class="literal">1.0</code> et <code class="literal">4.0</code>.
   </p>
   <p class="para">
    Maintenant considérons que <code class="code">$randomizer-&gt;getFloat(1.625, 2.5, IntervalBoundary::ClosedOpen)</code>
    est appelé, c&#039;est-à-dire qu&#039;un flottant aléatoire commençant à <code class="literal">1.625</code> jusqu&#039;à,
    mais sans inclure, <code class="literal">2.5</code> est demandé.

    L&#039;algorithme détermine d&#039;abord le pas à la limite avec la plus grande valeur absolue
    (<code class="literal">2.5</code>). Le pas à cette limite est <code class="literal">0.25</code>.
   </p>
   <p class="para">
    Il est à noter que la taille de l&#039;intervalle demandé est <code class="literal">0.875</code>, qui n&#039;est
    pas un multiple exact de <code class="literal">0.25</code>.

    Si l&#039;algorithme commençait à marcher à la limite inférieure <code class="literal">1.625</code>, il
    rencontrerait <code class="literal">2.125</code>, qui n&#039;est pas exactement représentable et subirait
    un arrondi implicite.

    Donc l&#039;algorithme commence à marcher à la limite supérieure <code class="literal">2.5</code>.

    Les valeurs sélectionnables sont :
    <ul class="simplelist">
     <li><code class="literal">2.25</code></li>
     <li><code class="literal">2.0</code></li>
     <li><code class="literal">1.75</code></li>
     <li><code class="literal">1.625</code></li>
    </ul>

    <code class="literal">2.5</code> n&#039;est pas inclus, car la limite supérieure de l&#039;intervalle demandé
    est une limite ouverte.

    <code class="literal">1.625</code> est inclus, même si sa distance à la valeur la plus proche
    <code class="literal">1.75</code> est <code class="literal">0.125</code>, qui est plus petite que le pas
    déterminé précédemment de <code class="literal">0.25</code>.

    La raison pour laquelle c&#039;est le cas est que l&#039;intervalle demandé est fermé à la limite
    inférieure (<code class="literal">1.625</code>) et les limites fermées sont toujours incluses.
   </p>
   <p class="para">
    Finalement l&#039;algorithme sélectionne uniformément une des quatre valeurs sélectionnables
    au hasard et la renvoie.
   </p>
   <div class="refsect3 unknown-31" id="random-randomizer.getfloat.affine-transformation">
    <h5 class="title">Pourquoi diviser deux entiers ne fonctionne pas</h5>
    <p class="para">
     Dans l&#039;exemple précédent, il y a huit nombres flottants représentables
     entre chaque sous-intervalle délimité par une puissance de deux.

     Pour donner un exemple de pourquoi diviser deux entiers ne fonctionnerait pas bien
     pour générer un flottant aléatoire, considérons qu&#039;il y a 16 nombres flottants
     uniformément distribués dans l&#039;intervalle ouvert à droite de <code class="literal">0.0</code>
     jusqu&#039;à, mais sans inclure, <code class="literal">1.0</code>. La moitié d&#039;entre eux sont les
     huit valeurs exactement représentables entre <code class="literal">0.5</code> et <code class="literal">1.0</code>,
     l&#039;autre moitié sont les valeurs entre <code class="literal">0.0</code> et <code class="literal">1.0</code>
     avec un pas de <code class="literal">0.0625</code>.

     Ces valeurs peuvent facilement être générées en divisant un entier aléatoire entre
     <code class="literal">0</code> et <code class="literal">15</code> par <code class="literal">16</code> pour obtenir
     l&#039;une des valeurs suivantes :

     <ul class="simplelist">
      <li><code class="literal">0.0</code></li>
      <li><code class="literal">0.0625</code></li>
      <li><code class="literal">0.125</code></li>
      <li><code class="literal">0.1875</code></li>
      <li><code class="literal">0.25</code></li>
      <li><code class="literal">0.3125</code></li>
      <li><code class="literal">0.375</code></li>
      <li><code class="literal">0.4375</code></li>
      <li><code class="literal">0.5</code></li>
      <li><code class="literal">0.5625</code></li>
      <li><code class="literal">0.625</code></li>
      <li><code class="literal">0.6875</code></li>
      <li><code class="literal">0.75</code></li>
      <li><code class="literal">0.8125</code></li>
      <li><code class="literal">0.875</code></li>
      <li><code class="literal">0.9375</code></li>
     </ul>
    </p>
    <p class="para">
     Ce flottant aléatoire pourrait être mis à l&#039;échelle à l&#039;intervalle ouvert à droite
     de <code class="literal">1.625</code> jusqu&#039;à, mais sans inclure, <code class="literal">2.75</code> en le multipliant par la taille
     de l&#039;intervalle (<code class="literal">0.875</code>) et en ajoutant le minimum <code class="literal">1.625</code>.
     Cette transformation affine donnerait les valeurs suivantes :

     <ul class="simplelist">
      <li><code class="literal">1.625</code> arrondie à <code class="literal">1.625</code></li>
      <li><code class="literal">1.679</code> arrondie à <code class="literal">1.625</code></li>
      <li><code class="literal">1.734</code> arrondie à <code class="literal">1.75</code></li>
      <li><code class="literal">1.789</code> arrondie à <code class="literal">1.75</code></li>
      <li><code class="literal">1.843</code> arrondie à <code class="literal">1.875</code></li>
      <li><code class="literal">1.898</code> arrondie à <code class="literal">1.875</code></li>
      <li><code class="literal">1.953</code> arrondie à <code class="literal">2.0</code></li>
      <li><code class="literal">2.007</code> arrondie à <code class="literal">2.0</code></li>
      <li><code class="literal">2.062</code> arrondie à <code class="literal">2.0</code></li>
      <li><code class="literal">2.117</code> arrondie à <code class="literal">2.0</code></li>
      <li><code class="literal">2.171</code> arrondie à <code class="literal">2.25</code></li>
      <li><code class="literal">2.226</code> arrondie à <code class="literal">2.25</code></li>
      <li><code class="literal">2.281</code> arrondie à <code class="literal">2.25</code></li>
      <li><code class="literal">2.335</code> arrondie à <code class="literal">2.25</code></li>
      <li><code class="literal">2.390</code> arrondie à <code class="literal">2.5</code></li>
      <li><code class="literal">2.445</code> arrondie à <code class="literal">2.5</code></li>
     </ul>

     Il convient de noter comment la limite supérieure de <code class="literal">2.5</code> serait retournée,
     malgré le fait que ce soit une limite ouverte et donc exclue.

     Il est également à noter comment <code class="literal">2.0</code> et <code class="literal">2.25</code> sont deux fois
     plus susceptibles d&#039;être retournés par rapport aux autres valeurs.
    </p>
   </div>

  </div>

 </div>


 <div class="refsect1 parameters" id="refsect1-random-randomizer.getfloat-parameters">
  <h3 class="title">Liste de paramètres</h3>
  <p class="para">
   <dl>
    
     <dt><code class="parameter">min</code></dt>
     <dd>
      <p class="para">
       La limite inférieure de l&#039;intervalle.
      </p>
     </dd>
    
    
     <dt><code class="parameter">max</code></dt>
     <dd>
      <p class="para">
       La limite supérieure de l&#039;intervalle.
      </p>
     </dd>
    
    
     <dt><code class="parameter">boundary</code></dt>
     <dd>
      <p class="para">
       Spécifie si les limites de l&#039;intervalle sont des valeurs de retour possibles.
      </p>
     </dd>
    
   </dl>
  </p>
 </div>


 <div class="refsect1 returnvalues" id="refsect1-random-randomizer.getfloat-returnvalues">
  <h3 class="title">Valeurs de retour</h3>
  <p class="para">
   Une valeur flottante uniformément sélectionnée et équidistribuée de l&#039;intervalle spécifié par
   <code class="parameter">min</code>, <code class="parameter">max</code> et <code class="parameter">boundary</code>.

   Le fait que <code class="parameter">min</code> et <code class="parameter">max</code> soient des valeurs de retour possibles
   dépend de la valeur de <code class="parameter">boundary</code>.
  </p>
 </div>


 <div class="refsect1 errors" id="refsect1-random-randomizer.getfloat-errors">
  <h3 class="title">Erreurs / Exceptions</h3>
  <ul class="itemizedlist">
   <li class="listitem">
    <span class="simpara">
     Si la valeur de <code class="parameter">min</code> n&#039;est pas finie (<span class="function"><a href="function.is-finite.php" class="function">is_finite()</a></span>),
     une <span class="classname"><a href="class.valueerror.php" class="classname">ValueError</a></span> sera lancée.
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     Si la valeur de <code class="parameter">max</code> n&#039;est pas finie (<span class="function"><a href="function.is-finite.php" class="function">is_finite()</a></span>),
     une <span class="classname"><a href="class.valueerror.php" class="classname">ValueError</a></span> sera lancée.
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     Si l&#039;intervalle demandé ne contient aucune valeur,
     une <span class="classname"><a href="class.valueerror.php" class="classname">ValueError</a></span> sera lancée.
    </span>
   </li>
   
 <li class="listitem">
  <span class="simpara">
   Tout <span class="classname"><a href="class.throwable.php" class="classname">Throwable</a></span>s lancé par la méthode <span class="methodname"><a href="random-engine.generate.php" class="methodname">Random\Engine::generate()</a></span>
   du <a href="class.random-randomizer.php#random-randomizer.props.engine" class="link"><code class="literal">Random\Randomizer::$engine</code></a> sous-jacent.
  </span>
 </li>

  </ul>
 </div>


 <div class="refsect1 examples" id="refsect1-random-randomizer.getfloat-examples">
  <h3 class="title">Exemples</h3>
  <div class="example" id="example-1">
   <p><strong>Exemple #1 Exemple de <span class="methodname"><strong>Random\Randomizer::getFloat()</strong></span></strong></p>
   <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$randomizer </span><span style="color: #007700">= new </span><span style="color: #0000BB">\Random\Randomizer</span><span style="color: #007700">();<br /><br /></span><span style="color: #FF8000">// Il est à noter que la granularité de la latitude est le double<br />// de la granularité de la longitude.<br />//<br />// Pour la latitude, la valeur peut être à la fois -90 et 90.<br />// Pour la longitude, la valeur peut être 180, mais pas -180, car<br />// -180 et 180 font référence à la même longitude.<br /></span><span style="color: #0000BB">printf</span><span style="color: #007700">(<br />    </span><span style="color: #DD0000">"Lat: %+.6f Lng: %+.6f"</span><span style="color: #007700">,<br />    </span><span style="color: #0000BB">$randomizer</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getFloat</span><span style="color: #007700">(-</span><span style="color: #0000BB">90</span><span style="color: #007700">, </span><span style="color: #0000BB">90</span><span style="color: #007700">, </span><span style="color: #0000BB">\Random\IntervalBoundary</span><span style="color: #007700">::</span><span style="color: #0000BB">ClosedClosed</span><span style="color: #007700">),<br />    </span><span style="color: #0000BB">$randomizer</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getFloat</span><span style="color: #007700">(-</span><span style="color: #0000BB">180</span><span style="color: #007700">, </span><span style="color: #0000BB">180</span><span style="color: #007700">, </span><span style="color: #0000BB">\Random\IntervalBoundary</span><span style="color: #007700">::</span><span style="color: #0000BB">OpenClosed</span><span style="color: #007700">),<br />);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   <div class="example-contents"><p>Résultat de l&#039;exemple ci-dessus est similaire à :</p></div>
   <div class="example-contents screen">
<div class="annotation-interactive examplescode"><pre class="examplescode">Lat: +69.244304 Lng: -53.548951</pre>
</div>
   </div>
  </div>
 </div>


 <div class="refsect1 notes" id="refsect1-random-randomizer.getfloat-notes">
  <h3 class="title">Notes</h3>
  <blockquote class="note"><p><strong class="note">Note</strong>: 
   <p class="para">
    Cette méthode implémente l&#039;algorithme de la section γ tel que publié dans
    <a href="https://dl.acm.org/doi/10.1145/3503512" class="link external">&raquo;&nbsp;
     Drawing Random Floating-Point Numbers from an Interval.
     Frédéric Goualard, ACM Trans. Model. Comput. Simul., 32:3, 2022
    </a>
    pour obtenir les propriétés comportementales souhaitées.
   </p>
  </p></blockquote>
  <div class="caution"><strong class="caution">Attention</strong>
   <p class="para">
    Le sous-dépassement (underflow) est intentionnellement laissé non géré dans l&#039;algorithme
    de la section γ. Cela peut entraîner le retour de valeurs incorrectes pour les intervalles
    dont les limites se trouvent dans la plage sous-normale des nombres à virgule flottante,
    c&#039;est-à-dire pour des limites dont la valeur absolue est inférieure à environ
    <code class="literal">2<sup class="superscript">-1020</sup></code> (environ <code class="literal">8.9e-308</code>).
   </p>
  </div>
 </div>


 <div class="refsect1 seealso" id="refsect1-random-randomizer.getfloat-seealso">
  <h3 class="title">Voir aussi</h3>
  <ul class="simplelist">
   <li><span class="methodname"><a href="random-randomizer.nextfloat.php" class="methodname" rel="rdfs-seeAlso">Random\Randomizer::nextFloat()</a> - Renvoie un flottant s&eacute;lectionn&eacute; de l'intervalle ouvert &agrave; droite [0.0, 1.0)</span></li>
   <li><span class="methodname"><a href="random-randomizer.getint.php" class="methodname" rel="rdfs-seeAlso">Random\Randomizer::getInt()</a> - Renvoie un entier s&eacute;lectionn&eacute; de mani&egrave;re uniforme</span></li>
  </ul>
 </div>


</div><?php manual_footer($setup); ?>