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

2024-09-30 14:21:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我很清楚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),它将给出一个索引错误。我该如何改进/更改它,使它能够处理任意两个数字?在


Tags: 方法infortimerangerandomnum内置
3条回答

这使用的逻辑与您的几乎完全相同,但不会超出范围。我明白这只是为了学习,但我觉得有必要说我不会用这个来代替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。在

你需要一个函数,比如randombits(),它在某个范围内生成一个随机整数(即256或2^32)。那么random()函数需要首先取x和{}的差值,即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
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一样使用它数学随机我发现你会更喜欢这个的。我相信你知道如何使用它,但这里有一些例子,以防你不知道。在

^{pr2}$

如你所见,它生成了一个介于1到10之间的数字,后跟50个零。使用随机随机范围我希望这样能帮你一点忙。在

相关问题 更多 >