python中自制随机数生成器的问题。(使用time.time())

python中自制随机数生成器的问题。(使用time.time()),python,math,random,time,numbers,Python,Math,Random,Time,Numbers,我很清楚python有一个内置的随机库,所以请不要在本文中引用它。我使用time.time()采用自己动手的方法。我制作了一个简单的随机数生成器,如下所示: def random(x, y): import time choices = [i for i in range(x, y)] t = time.time() num = int(str(t-int(t))[2:])%100 xnum = [i for i in range(num, choices

我很清楚python有一个内置的随机库,所以请不要在本文中引用它。我使用
time.time()
采用自己动手的方法。我制作了一个简单的随机数生成器,如下所示:

def random(x, y):
    import time
    choices = [i for i in range(x, y)]
    t = time.time()
    num = int(str(t-int(t))[2:])%100
    xnum = [i for i in range(num, choices[-1])]
    ynum = [choices[i] for i in xnum]
    znum = ynum[choices[num-1]]
    ret = choices[znum]
    return ret

这对于像
random(1200)
这样的任何东西都非常有效;然而,它也有一些问题。例如,如果我做
random(10200)
,它会给出一个索引错误。如何改进/更改它以使其处理任意两个数字?

您需要有一个函数,例如
randombits()
,它可以生成某个范围内的随机整数(即256或2^32)。然后您的
random()
函数需要首先取
x
y
的差值,即
random(x,y)
的可能输出数。然后它需要计算需要调用多少次
randombits()
,以获得足够的熵。然后它需要将
randombits()
的多个调用的值组合成一个长整数。 一种方法是将
randombits()
的输出放入长随机整数的一个单独数字中,即如果调用的输出是
8、9、1
,则长随机整数将是891

然后它需要将长随机整数缩小到可能的输出数(x和y之间的差)。
random.random()
使用的一种方法是不断获取长随机整数,直到它在范围内。然后需要将长随机整数添加到
x
,并返回该值

代码:

RANDOMBITS\u范围=256
def randombits():
返回4#将此代码替换为生成真实随机数的代码
def随机(x,y):
数值范围=y-x
调用的数量=数量范围//随机位范围
random_integer=num_range+1#,以便第一次执行while循环块
当random_integer>=num_range时:#保持循环,直到random_integer
这与您的逻辑几乎完全相同,但不会超出范围。我知道这只是为了学习,但我觉得有必要说,我不会用它来代替
random
。无论如何,此代码不会崩溃:

from time import time
def randomNum(x, y):
    #ensures the function is called properly, you can handle this however you'd like to
    assert y > x and x > 0 

    choices = [i for i in range(x, y + 1)]
    t = time()

    #ensures that the number is less than y
    num = int(str(t-int(t))[2:])%y 
    xnum = [i for i in range(num, y)]

    #ensures that you don't get out of bounds for choices
    ynum = [choices[i%(y+1-x)] for i in xnum] 

    #same as above + ensure you don't go out of bounds for ynum, too
    znum = ynum[choices[(num-1)%(y-x)]%(y-num)]

    ret = choices[znum%(y+1-x)]
    return ret
NB
虽然这不会崩溃,但它不会给出伪随机数,即如果您输入
randomNum(1,10)
则无法生成2,3或5

class Random:
    def __init__(self):
        self.num = 20
        self.j = 1
    def randomBits(self):
        self.j = self.num * self.j
        self.j = float("0.%s" % int(self.j))
        return self.j
    def randrange(self,x, y):
         self.randomBits()
         return int(self.j * (y - x) + x)
不过,我做了一些“硬编码”,它总是一个小数,所以我可以像JavaScript的数学一样使用它。我相信你知道如何使用它,但这里有一些例子,以防你不知道

>>> random = Random()
>>> random.randrange(1,10**50)
20000000000000001525953968218377400658992994189312

如你所见,它生成了一个介于1和10之间的数字,后面跟着50个零。使用random.randrange(numberOne,numberTwo)我希望这种方法对您有所帮助。

这里有一个提示:比较
len(选项)
len(xnum)
您知道,对于任何给定的x和y值,这最多只能产生100个结果中的一个,而不管它们之间的差距有多大,对吗?你用
xnum
ynum
znum
做的大部分事情都是毫无意义的。@Hyperboreus他只是想学。。。
>>> random = Random()
>>> random.randrange(1,10**50)
20000000000000001525953968218377400658992994189312