【问题标题】:Compute random number over certain time interval with Python使用 Python 在特定时间间隔内计算随机数
【发布时间】:2013-01-23 23:48:59
【问题描述】:

我在发帖前做了一些研究,但似乎不知所措(在编码方面没有太多经验)。

我正在尝试使用 Python 生成或计算特定时间间隔的随机数。我不是在寻找完整的代码,如果正确使用时间库,我需要帮助。

伪代码:

让 python [PC] 计算一个随机数 3 秒

------> 将计算生成的值存储在一个值中(我可以处理)

然后,我将使用随机生成的值来链接访问 python 列表(这也将通过随机数生成自动生成,但我可以弄清楚)。

【问题讨论】:

  • 第 1 步是什么意思?假设它平均计算一个随机数,例如 1us。那么,你想在 3 秒内做什么?计算大约 3,000,000 个随机数并将它们全部存储?计算大约 3,000,000 个随机数并存储最后一个?计算 1 个随机数,等待大约 2.999999 秒,然后存储?还是……?
  • 或者您只是想计算 0 到 3 之间的随机浮点数?
  • 我想实时计算一个随机数 3 秒。允许计算机说第一秒它生成#10 ....然后还有2秒的生成,然后它会将10更改为另一个数字等等,以达到3秒的停止周期/时间并给出______的生成结果。
  • 你为什么要这样做?如果计算一个随机数只需要 1us,为什么要花 3 秒呢?
  • 它不会是一样的,不……但它不会以任何有意义的方式有所不同。随机数的全部意义在于它们是随机的,所以你选择哪个并不重要。

标签: python random python-3.x


【解决方案1】:

我不确定你为什么要这样做,但这里是计算许多随机数的方法,将其中大部分丢弃,然后在 3 秒后使用最后一个。

import random
import time

start = time.clock()
while time.clock() - start < 3:
    random_number = random.randint(0,100)

print random_number

这毫无意义地丢弃了我机器上大约 200 万个非常好的随机数。

(而且,正如abarnert 指出的那样,这也会在繁忙循环中的整个 3 秒内最大限度地使用一个 CPU 内核,这非常非常浪费,但我认为这正是您所要求的?)

编辑: 更新为使用 time.clock 而不是 time.time,正如 abarnert 再次建议的那样(谢谢),因为这似乎提供了更好的跨平台分辨率,并且在系统时间在程序运行过程中发生变化。

【讨论】:

  • 而且它还在我的机器上浪费了近 100% 的一个内核 3 秒。 (但这不是这个程序的错误;看起来这就是 OP 可能要求的。)
  • 我知道。我认为这就是OP想要的。您的解决方案使用更少的 CPU,但(毫无意义)只丢弃 2 个随机数。我可以(毫无意义地)用我忙碌的解决方案扔掉一百万倍的东西:)
  • 哇,这比第一个还要好。谢谢@Day。
  • @Bain:“随机流动”是什么意思?实际上,CPU 一次又一次地确定性地执行一组非常简单的步骤(例如,计算下一个 Yarrow 或 Mersenne-Twister 值),这与随机几乎完全相反。
  • @Day:最后一件事:我想你在这里想要time.monotonic,而不是time.time。或者,如果 OP 使用 3.2 或更早版本,则使用更复杂的东西,例如 time.clock。因为在某些平台上,time.time 只有 1 秒的分辨率和/或只更新每个调度程序滴答,这意味着这可以很容易地在 2.07 秒而不是 3 秒之后完成。
【解决方案2】:

首先,你没有说你想生成什么样的随机数,但鉴于你的例子是10,我假设它是某个范围内的整数——假设你正在调用random.randrange(30)。

现在,您想在 3 秒内每秒计算一个数字,然后保留最后一个。我不知道你为什么要这样做,但你可以这样做:

for i in range(3):
    number = random.randrange(30)
    time.sleep(1.0)

在 3 秒结束时,number 将是生成的第三个随机数。

这里的关键是,每秒执行一次(在同步程序中——不要在 GUI 或服务器中执行此操作!)——你只需调用 time.sleep。

如果您正在执行的操作花费大量时间(或更长),那么这将是不合适的。相反,您需要计算开始时间,然后休眠到一秒钟:

t0 = time.monotonic()
for i in range(3):
    number = random.randrange(30)
    t0 += 1
    time.sleep(t0 - time.monotonic())

请注意,我在这里使用了time.monotonic。此功能专为此类用例而设计。它以合理的效率返回尽可能多的精度(特别是,与time.time 不同,它在某些平台上不会给你 1 秒的精度),并且它保证你永远不会倒退,例如,你在程序中间更改系统时钟。如果您使用的是 3.2 或更早版本,请查看文档以找到最佳替代方案(可能使用 time.clock()),或查看使用 ctypes 调用适当的平台原生函数。

但在这种情况下,random.randrange 将花费大约一微秒的时间,这比大多数系统的简单计时器的最小分辨率要短得多,因此没有理由这样做。

【讨论】:

  • 谢谢!整数的生成将在 randrange(x) 中。我可以说 100,它会生成 1 到 100 之间的数字?
  • @Bain:是的。单击我的答案中的链接以查看文档,或者在您的解释器中输入help(random)。
  • +1,因为这比我的解决方案更环保,对地球更好,因为我的解决方案会无缘无故地烧毁 CPU。
  • @Day:是的,当宇宙中的随机数用完并且量子物理学停止工作时,我在责怪你。 :)
【解决方案3】:

如果你想花 3 秒时间得到一个随机数,因为你关心随机数的质量,你可以使用 os.urandom() 来生成值。如果您真正想做的只是从列表中随机选择一个项目,您可以使用 random.choice()

【讨论】:

    【解决方案4】:

    注意:函数 time.clock() 已被删除,自 Python 3.3 起已被弃用:根据您的要求,使用 time.perf_counter() 或 time.process_time() 代替,以获得明确定义的行为。 (由 Matthias Bussonnier 在 bpo-36895 中贡献。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-14
      • 2019-07-14
      • 2017-09-02
      • 2019-07-16
      • 2019-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多