【问题标题】:Generate random array of integers with a number of appearance of each integer生成随机整数数组,每个整数出现的次数
【发布时间】:2018-09-28 17:49:50
【问题描述】:

我需要在 Python 中创建一个包含 1 到 5 之间的 6 个整数的随机数组,但我还有另一个数据说 a=[2 2 3 1 2] 可以被视为容量。这意味着 1 可以出现不超过 2 次或 3 可以出现不超过 3 次。

我需要为从 1 到 5 的每个整数设置一个计数器,以确保随机函数生成的每个整数不超过 a[i]。

这是我在 python 中创建的初始数组,但我需要了解如何确定上述条件。例如,我不需要像 [2 1 5 4 5 4] 这样的解决方案,其中 4 显示两次或 [2 2 2 2 1 2]。

solution = np.array([np.random.randint(1,6) for i in range(6)])

即使我可以添加概率,那也应该有效。对此的任何帮助表示赞赏。

【问题讨论】:

    标签: python random


    【解决方案1】:

    您可以创建一个计数最多的数据池,然后从中挑选:

    import numpy as np
    
    a = [2, 2, 3, 1, 2]
    
    data = [i + 1 for i, e in enumerate(a) for _ in range(e)]
    print(data)
    result = np.random.choice(data, 6, replace=False)
    print(result)
    

    输出

    [1, 1, 2, 2, 3, 3, 3, 4, 5, 5]
    [1 3 2 2 3 1]
    

    请注意,数据是数组,每个元素都有指定的计数,然后我们从数据中随机选择,这样可以确保您不会有更多的元素超过指定的计数。

    更新

    如果您需要每个数字至少出现一次,您可以从每个数字的列表开始,从其余数字中取样,然后随机播放:

    import numpy as np
    
    result = [1, 2, 3, 4, 5]
    a = [1, 1, 2, 0, 1]
    data = [i + 1 for i, e in enumerate(a) for _ in range(e)]
    print(data)
    result = result + np.random.choice(data, 1, replace=False).tolist()
    np.random.shuffle(result)
    print(result)
    

    输出

    [1, 2, 3, 3, 5]
    [3, 4, 2, 5, 1, 2]
    

    请注意,我从 a 的每个原始值中减去 1,原始 6 也更改为 1,因为变量 result 中已经有 5 个数字。

    【讨论】:

    • 你需要replace=False 在那个np.random.choice 电话;没有它,仍然有可能多次选择一个元素,从而超出计数。
    • 感谢您的帮助。您还可以帮我添加另一个条件,即所有数字必须至少生成一次吗?
    【解决方案2】:

    你可以用字典来测试你的计数

    import random
    
    a = [2, 2, 3, 1, 2]
    d = {idx: item for idx,item in enumerate(a, start = 1)}
    l = []
    while len(set(l) ^ set([*range(1, 6)])) > 0:
        l = []
        while len(l) != 6:
            x = random.randint(1,5)
            while l.count(x) == d[x]:
                x = random.randint(1,5)
            l.append(x)
    
    print(l)
    

    【讨论】:

    • 感谢您的帮助。您还可以帮我添加另一个条件,即所有数字必须至少生成一次吗?例如,如果 a 更改为下面的列表,我不希望 l 为 [2, 2, 2, 2, 2, 2]。
    • @Sarah 是的,这应该是可能的,我很快就会看看!
    • @Sarah 看看! :)
    猜你喜欢
    • 2018-08-10
    • 1970-01-01
    • 1970-01-01
    • 2018-10-09
    • 2014-08-22
    • 2013-04-28
    • 1970-01-01
    • 2018-09-07
    • 2010-12-09
    相关资源
    最近更新 更多