【问题标题】:how to count a list of numbers which occour in a random list Python如何计算随机列表Python中出现的数字列表
【发布时间】:2021-10-28 02:56:39
【问题描述】:

我从 0-11 的列表中运行了 1000 次 random.choice()。如何在至少一次选择所有 12 个数字之前跟踪必要的随机选择次数。 (许多人将被选中不止一次。) 例如,假设模拟产生以下随机选择序列 试用: 2 5 6 8 2 9 11 10 6 3 1 9 7 10 0 7 0 7 4,其中所有 12 个号码都至少选择了一次。此示例试验的计数是 19。收集每个试验的计数 单个列表中的模拟(最终包含 1,000 个计数)。

【问题讨论】:

  • 这看起来像是一个家庭作业问题。你试过什么了?你遇到了什么困难?
  • 列出您迄今为止尝试过的内容,我们可以帮助解决问题。
  • mylist=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] 序列=[random.choice(mylist) for i in range(1000 )] list=[] if mylist in sequence: list.append(mylist)
  • 我的麻烦是如何计算这些数字在这个序列列表中出现一次。

标签: python random


【解决方案1】:

这是一个使用collections.Counter作为容器的解决方案:

from collections import Counter
import random

nums = list(range(12))
n = 1000
counts = [0]*n
for trial in range(n):
    c = Counter()
    while len(c)<len(nums):
        c[random.choice(nums)]+=1
    counts[trial] = sum(c.values()) # c.total() in python ≥ 3.10

counts

输出:

[28, 24, 39, 27, 40, 36, ...] # 1000 elements

计数分布:

【讨论】:

  • 计数器很好用;我不知道它添加了.total() 函数。
  • 这是 python 3.10 中的新功能
  • 我对此有一个新问题。如果我想使用 random.choices(nums, weights),我怎样才能让它工作
【解决方案2】:

也许您可以尝试使用集合以非冗余方式存储结果,同时检查是否所有数字都已使用:

import random

guesses = set()
count = 0
for i in range(1000):
    count += 1
    guesses.add(random.randrange(0, 12))
    if len(guesses) == 12:
        break
print(count)

这会给你 1 个计数。 mozway 在他们的回答中概述了一种更好的方法。

您可以运行代码一百万次并将结果收集到一个列表中,然后像这样绘制它(使用while 条件更新):

import random
import numpy as np
from matplotlib import pyplot as plt

counts = []
for i in range(100000):
    guesses = set()
    count = 0
    while len(guesses) != 12:
        count += 1
        guesses.add(random.randrange(0, 12))

    counts.append(count)

fig = plt.figure(figsize=(8, 6))
x = np.array([i for i in range(np.max(np.array(counts)))])
y = np.array([counts.count(i) for i in range(np.max(np.array(counts)))])
plt.bar(x, y)
plt.xlabel('Number of Guesses')
plt.ylabel('Frequency')
plt.show()

所以[counts.count(i) for i in range(np.max(np.array(counts)))] 将为您提供一个列表,说明猜谜游戏在该列表的给定位置上完成的频率。 IE。列表的第一个值是 0,因为只有 1 次猜测就无法结束游戏,但在第 25 位(25 次猜测)有超过 2000 次发生这种情况

【讨论】:

  • 谢谢!如果我想获取每个计数中有多少项的列表,该怎么办
  • IIUC 的问题,这个答案只产生一个计数,而 OP 预计 1000
  • :D 我只是为了好玩而添加了一个直方图,并意识到你做了同样的事情,伟大的思想都一样:p +1
  • 直方图的任何借口,我都被卖掉了(虽然我的只是一个香草条形图);)
  • 谢谢大家!你们真棒!我真的需要一些时间来研究你的代码。
【解决方案3】:

一种简单(但效率低下)的方法是使用

check = range(11)
if all(elem in randlist for elem in check): # check after each choice
    # do something

正如其他人所说,请告诉我们您迄今为止所做的尝试,以便我们进一步提供帮助。

【讨论】:

    猜你喜欢
    • 2018-09-25
    • 1970-01-01
    • 2021-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多