<div dir="ltr"><div><div><div class="gmail_extra"><div class="gmail_quote">On Thu, Feb 2, 2017 at 7:01 AM,  <span dir="ltr"><<a target="_blank" href="mailto:himchanterry@gmail.com">himchanterry@gmail.com</a>></span> wrote:<br><blockquote style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex" class="gmail_quote"><div lang="EN-US"><div class="gmail-m_-1348873804364445309WordSection1"><p class="MsoNormal">from random import *<u></u><u></u></p><p class="MsoNormal"><u></u> <u></u></p><p class="MsoNormal">def randfloat(x , y , maxfloatpt=None):<u></u><u></u></p><p class="MsoNormal">    if x > y:<u></u><u></u></p><p class="MsoNormal">        x , y = y , x<u></u><u></u></p><p class="MsoNormal">    lenx = len(str(x))<u></u><u></u></p><p class="MsoNormal">    leny = len(str(y))<u></u><u></u></p><p class="MsoNormal">    intx = int(x)<u></u><u></u></p><p class="MsoNormal">    inty = int(y)<u></u><u></u></p><p class="MsoNormal">    bigger = max(lenx,leny)<u></u><u></u></p><p class="MsoNormal">    if maxfloatpt == None:<u></u><u></u></p><p class="MsoNormal">        if bigger == lenx:<u></u><u></u></p><p class="MsoNormal">            intxlen = len(str(intx))<u></u><u></u></p><p class="MsoNormal">            maxfloatpt = len(str(x)[intxlen:])<u></u><u></u></p><p class="MsoNormal">        elif bigger == leny:<u></u><u></u></p><p class="MsoNormal">            intylen = len(str(inty))<u></u><u></u></p><p class="MsoNormal">            maxfloatpt = len(str(y)[intylen:])<u></u><u></u></p><p class="MsoNormal">        else:<u></u><u></u></p><p class="MsoNormal">            pass<u></u><u></u></p><p class="MsoNormal">   else:<u></u><u></u></p><p class="MsoNormal">        pass<u></u><u></u></p><p class="MsoNormal">    num = randint(intx , inty)<u></u><u></u></p><p class="MsoNormal">    num = str(num)<u></u><u></u></p><p class="MsoNormal">    num = '%s.' % num <u></u><u></u></p><p class="MsoNormal">    for i in range(0 , maxfloatpt):<u></u><u></u></p><p class="MsoNormal">        flnum = randint(0 , 9)<u></u><u></u></p><p class="MsoNormal">        str(flnum)<u></u><u></u></p><p class="MsoNormal">        num = '%s%s' % (num , flnum)<u></u><u></u></p><p class="MsoNormal">    return float(num)<u></u><u></u></p><p class="MsoNormal">        <u></u><u></u></p><p style="text-indent:10.2pt" class="MsoNormal">P.S.: If the indent has anything wrong, just correct me, thx!<u></u><u></u></p><p style="text-indent:10.2pt" class="MsoNormal"><u></u> <u></u></p><p class="MsoNormal">P.P.S.: The function is tested, it’s working <span style="font-family:"segoe ui emoji",sans-serif">😊</span><br></p></div></div></blockquote></div><br>It looks like this is generating a random float one digit at a time. Instead, consider the following:<br><br></div><div class="gmail_extra">Say you have a function which generates a number between 0 and n. You want to generate a number between floats x and y, as fairly as you can. So stretch the range 0...n onto the range x...y, linearly. That means 0 goes to x, n goes to y, things close to 0 go to things close to x, etc.<br><br></div>If x is 0, then it's simple:<br><br></div>    def stretch(num):<br></div>        return num / n * y<br><div><br></div><div>We just need to make x = 0 temporarily, shifting y down as well:<br><br></div><div>    def stretch(num):<br></div><div>        return (num / n * (y - x)) + x<br><br></div><div>Really, we care about the _length_ of the interval [x,y], relative to the length of [0,n].<br><br></div><div>Since we want to reach as many numbers as possible in [x,y], we just need n to be really big. The limit of n depends on how randint is implemented. I'm not sure whether Python uses extra randoms in the case of long ints, but let's say that 2^15 is both big enough for us and small enough for Python's randints to be pretty random.<br><br></div><div>    import random<br></div><div>    def randfloat(x, y):<br></div><div>        r = random.randint(0, 2**15) #our random int<br></div><div>        length = y - x #length of the interval<br></div><div>        f = (r / 2**15 * length) + x<br></div><div>        return f<br></div><div><br></div><div>(Python 2 will do truncating division up there, so you'd need to make it do floating point division with a __future__ import or a cast.)<br></div><div><br></div><div>To be responsible, we should probably up the limit to around 2^54 (which is the limit of precision for the 64-bit floats used by Python), and we'd need to learn about how random randint can be with large numbers, then generate larger random numbers using smaller ones.<br><br></div><div>To be really responsible, we would not assume that floats are 64-bit.<br></div><div><div><div><div><div class="gmail_extra"><br></div><div class="gmail_extra">(Fortunately, we don't have to be responsible, because Daniel pointed out that this function exists in Python's random.)<br><br></div><div class="gmail_extra">The idea of linearly mapping one range to another is useful, so please remember it. In fact, the stretch works even if x is bigger than y.<br></div></div></div></div></div></div>