<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=http://email.email.llvm.org/c/eJylVU1v2zgQ_TXyhaggk5JtHXxInGYRYIstmqLXgJTGFhuK1PIjiffX7wzt2E7aLRaoQUskZvg48_hmpFy_Xxf8Csd9Gkfp94W4OqyL6qaorm6dZ3EA1oN1o7Yy4lpbVjTXOLy0fZmiNmUnrbO6k6Zobgp-W-fXaohxyni3OABMqQNOuoJf4-i93EZc_gyEi7rgbcE37A5P1_aRGa26lxemA0N7l4yM2u7Y1jjn8SDjdg8c31_yrpZ5iTFT4NKyt7YNex50NyBKChCYjiw65p7Ah8G5mFO1aVS42W3RCoiknQ3Mw99Je-jLAy3HZybqC0zevaOtWFSH0U3Tq6_QtjOpB1aITSdDAB8L8fFnVqLEjWdjfoboUxdZ55Kl3B-SVztWLK8PVoa_FIgTDyGZ-BD3E2HdsGSD3lnoC3Hh2mFOEV4mz0LEDLs3u_CekS_iEeHREpO3rML9uL75vxjy5UcMfsRgB0Xg9OO8bFYNUzoGIhxs9G7an8-4hHQT3Ua-73yVJ_SDnjIxdMB_Bqztkb7MS3UihJxO8_wkz1Fe0nCZ9uUF7MC-IRZ3PDnd064Qe1KFuEIfihwezgIXm94lZYAE2Qi6ab4iKMzrEu2okmwrT6FT9IcCoQwPVCIIv32VushBNxs5oTJfmBBlXV9yeuLnnP9b1V5yQUUcTlW8c71yJpbO73D1D_6_t636_HX7x-cfK-MvqsJ3lXFX8OXInp1_JLE6yyTbJmP2jIrlVVE4PxffueJxvsX-8-n-24bJyN5FpuOQFLI04mLUnXfB5QZz__VPfE54CL543a5K7CqDfCK6l6QIFJ1WKUJPveDYaBTgSfl60ML0lu1dQncPpCJAWZL7HYnB4Da_ZyGpUcfclSSbZOwGPCZiouRgAb2DG4HJvteUiDSZAzpgcM-ADYimeD62rN4AO2qG4EYM5NDKFnWulHLWr0XfilbOZIqD8-tPMsb7CBM6BWdnyZv1L8gx5un19QEF8h06okmHkID6cyPq-Xw2rBdL1SvZNRx4oxSIFkDWdcs5ny-qJaxmRiowYU3fAs4tPLMMgXPs_rPfj0CvecV5NeeLis9FvSjbrhdbNW-apl00q04UdQVYpaYkHFLkzK8zpEq7gEajA5J1MmIxUSOEHDBGGHU0uFhUvypUFGKUj_iliM5hS7D7i4_CLAe8ztH-Cy38PqY>53411</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            `std::generate_canonical` takes too many iterations
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          MattStephanson
      </td>
    </tr>
</table>

<pre>
    **Summary:**
For the denominator in [[rand.util.canonical]/4](http://eel.is/c++draft/rand.util.canonical#4), I think libcxx is calculating floor(log_2(R)) rather than log_2(R), which causes it to overshoot the number of iterations required.

**Repro:**
```cpp
#include <cassert>
#include <random>

struct counting_urbg {
    using result_type = unsigned;
    constexpr static result_type min() { return 0; }
    constexpr static result_type max() { return 2; } // ~1.585 bits of entropy
    result_type operator()() { ++count; return 0; }
    int count = 0;
};

int main() {
    counting_urbg gen;
    (void) std::generate_canonical<double, 53>(gen);
    assert(gen.count == 34); // 53/log_2(3) \approx 33.44
    return 0;
}
```

https://godbolt.org/z/j99bPTfGP

**Other:**
I'm working on a fully `constexpr` iteration calculation for MSVC at https://github.com/microsoft/STL/pull/2498. I haven't contributed to libcxx before, but if you're interested I could try submitting a patch. It would need some additional work, however, to handle generating more than 64 bits.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyNVdtu4zYQ_Rr5haggk5JtPeghcTZFgC662Cz6GpAUZXFDkSovid2v7wzt2E52u6hB84IZzuXwzEi4_tAV9AbGY5om7g8Fuzmei-quqG7unSdxVKRX1k3a8ghnbUnR3MLw3PZlitqUkltnteSmaO4Kel_nZTPGOGd79zCUMqUOsJEFvYXRez5EOP7MCGV1QduCbskDeNf2mRgt5H5PdCAgl8nwqO2ODMY5D46M2z1RWL_mWy3xHGLGwLkl72Vb8jpqOYKVFFQgOpLoiHtRPozOxZyqTZOAy24AqQJL2tlAvPo7aa_68gjLac5AfVWzdx9gK1bVcch5ftNl2kqTekUKtpU8BOVjwT79TIqQuOkizHOIPslIpEsWc39KXuxIsb49Sgn8UkBMvArJxKd4mNHWHUk26J1VfcGuVCXkFNV-9iREyFC-uwXvDHghjmAeJDF5Syq4D-e7_2uD73-0QU82yJERsP20LJtNQ4SOAQFXNno3Hy4-rk26GV8jv3d-yrP1I58yMOjgPwPW9gRfxqU6A4JK532eUXPi1zBcp339ADtl3wELN16c7vFWiD2ygt2ADkauni4EZ9veJWEUErJh-NJ0g6Ygr2trJ5ZkWXkOHaM_FghmeIQSjND7N6qzHHSz5TMwc08YK-v6GtMzPpf837P2Ggss4nCu4p3rhTOxdH4Hp3_g_71txZdvw-9ffqyMP7EKP1TGQ0HXE3l1_hnJ6izhZEjGHAgWyxujYH8pvkvFw36A_vP58a8t4ZF8iEzHMQlAaYLDpKV3weUG8_jtD5hncAILrdtNCV1l5C8I9xoZAaTTIkXVYy84NRqhwFN-HpAQPZCDS6DuFbJIAS1R_QHJYOCaP5CQxKRj7kqczDzKEdxESBQVrALt4CZFeN9rTISbjAE6GN2rggaEW_APLas3ipw4g-YmCOTYylZ1rpRy0Xesb1nLF1FHozqA61dkAzAjf4ZuF50DWtvDVWNbJG-6XwBpzMvb8huQ6buSCKkOISns5Q2rl8vF2AnOuKzaXrCa1pt6s16LlVBivVK8VsPAFoYLZUKH3w1KrXol2QTs4Uux0B2tKK2WdFXRJatXZSt7Nohl0zTtqtlIVtSVgno0JcaB3Fv4Lock0i6A0OgAsJyFUDbY8lR2B_Z5iqPz3Wce42NUM0AZnF3kCLqcwb_NWimf">