【问题标题】:Python : Async random broken?Python:异步随机坏了?
【发布时间】:2022-01-30 14:20:45
【问题描述】:

所以我在异步 python 中工作,我必须处理随机数。 问题是,对于 0 到 4 之间的数字,我经常得到相同的数字,如下所示:

3 2 0 2 4 0 1 4 2 1 4 2 1 3 2 3 2 2 2 1 0 3 2 2 2 0 0 4 3 0 3 4 4 0 3 3 3 3 2 4 4 4 0

当然只有五种可能性,但看看最后,我连续获得了 4 个数字 3,这大约是 1/625 的机会,我们不谈论我在 3 次中获得相同数字的次数一行。

我的代码如下所示:

when async ready :
  random.seed(time.time())

async event:
  index = random.randint(0,4)
  async.send(someList[index])

它也是一个不和谐的机器人,所以代码连续运行,所以如果重要的话,种子只有一次 donc

【问题讨论】:

  • 如果需要我可以发布真实代码
  • 代码越多越好。另外,真的有必要打电话给random.seed吗?
  • 好吧,我每次都需要一个不同的号码,即使在重新启动程序后,因为是的,当我需要更新或修补东西时它会停止
  • 默认情况下 Python 的随机数生成器使用当前系统时间。所以对random.seed 的调用是多余的。请发布完整代码。
  • engineering.atspotify.com/2014/02/28/how-to-shuffle-songs 可能是相关的,随机序列的重复次数比人类预期的要多

标签: python asynchronous random


【解决方案1】:

如果没有更完整但最小的示例,我们无法确定您使用的代码是否按预期工作,但在 42 个元素的长列表中,一个值连续重复 4 次是很常见的。检查以下代码生成 1000 次 42 长的随机列表,检查每个列表中最长的重复,并计算它发生的频率。

import random
import matplotlib.pyplot as plt


length_of_longest = []

for j in range(1000):
    random.seed(j)
    rndstr = "".join([str(random.randint(0, 4)) for _ in range(42)])
    for i in range(1, 42):
        total = 0
        for my_str in "01234":
            for_my_str = rndstr.count(my_str*i)
            total += for_my_str
        if total == 0:
            length_of_longest.append(i-1)  # this length was not found
            break

# plot the results
fig, ax = plt.subplots()
ax.set_xticks([i+0.5 for i in range(8)], labels=range(8))
fig.patch.set_facecolor('white')
plt.hist(length_of_longest,bins=range(0,max(length_of_longest)+2))

这会产生以下情节:

x 轴表示最长重复 x 的频率(例如,在 x=5 时,序列中有 11111 或 33333 或 ...),y 表示使用此属性找到了多少系列超过 1000 个。

可以看出,在大约 15%-20% 的情况下,最长序列的长度是 4,但它也可以在 1000 次中出现几次,即在 7 次中选择相同的值一行。

【讨论】:

  • 哇!不这么认为,我猜我的随机数不是那么被操纵,谢谢你的精彩回复!
猜你喜欢
  • 1970-01-01
  • 2018-04-05
  • 2023-03-08
  • 2014-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多