生成一个随机数,每24小时更改一次



嗨,我做了一个应用程序,想知道我们可以使用random模块生成一个随机数吗?这个随机数每24小时就会改变一次?谢谢你的帮助。

您可以使用自固定日期以来的天数为random重新设定种子:

from datetime import datetime
import random
d0 = datetime(2008, 8, 18)  # Pick an arbitrary date in the past
d1 = datetime.now()
delta = d1 - d0
print(delta.days)
random.seed(delta.days)
print(random.randint(1,10))

这意味着print(random.randint(1,10))将在您今天运行此程序的任何时候产生相同的数字,但明天可能会产生不同的数字。

该代码的delta部分是从stackoverflow上的这个答案中复制的。

好吧,您可以使用randomdatetime模块。

这是示例代码:

import random, datetime
x = datetime.datetime.today().strftime("%Y:%m:%d")
random.seed(x)
r_int = random.randint(1, 100)
print(r_int)

输出:

73

基于重新播种PRNG的解决方案有效地使用seed函数作为随机数生成器,而不是PRNG状态更新算法。因此,无法保证结果的分布特性,而一个好的PRNG会产生一系列的值,这些值通过了大量的均匀性和缺乏序列相关性的统计测试。

下面的解决方案使用yield将其封装为生成器,但要生成的值只有在经过必要的时间段后才会更新,无论对生成器进行了多少次调用。如果你的应用程序打算长时间运行,并且你关心分布特性,我建议这样做:

from datetime import datetime, timedelta
from random import randint # , seed
import time
def durable_randint(*, low = 1, high = 100, duration = timedelta(days = 1)):
assert isinstance(duration, timedelta), 'duration must be a "timedelta"!'
today = datetime.now()
# seed(today.strftime("%Y:%m:%d"))
last = today - 2 * duration
while True:
now = datetime.now()
if now - last > duration:
x = randint(low, high)
last = datetime.now()
yield x
if "__main__" == __name__:
# The following is overriding the default duration of one day.
# It will run for 45 seconds (15 iterations of 3 seconds),
# changing the value generated every 10 seconds.
gen = durable_randint(duration = timedelta(seconds = 10)) # lazy generator
for _ in range(15):
print(gen.__next__())   # next iteration of the generator
time.sleep(3)

如果解决方案为一天,则取消对涉及seed的行的注释将在多个独立运行中产生一致的结果。

最新更新