Skip to main content
 首页 » 编程设计

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

2025年05月04日7zhoujg

我很清楚 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(1, 200) 这样的东西非常有效;但是,它有一些问题。例如,如果我要执行 random(10, 200),它会给出索引错误。我如何改进/更改它以使其处理任意两个数字?

请您参考如下方法:

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

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

代码:

RANDOMBITS_RANGE = 256 
 
def randombits(): 
 
    return 4 # Replace this code with something that generates real random numbers 
 
def random(x,y): 
    num_range = y-x 
    num_of_calls = num_range//RANDOMBITS_RANGE 
    random_integer = num_range + 1 #So that the first time the while loop block will execute 
    while random_integer >= num_range: #Keeps looping until random_integer < num_range 
        random_integer = sum(randombits()*RANDOMBITS_RANGE**x for x in range(num_of_calls)) 
    return random_integer