从列表中随机选择至少一次

时间:2018-02-01 22:30:27

标签: python random

我在Python列表中有10个元素。我想从这个列表中随机选择一个项目 - 多次(超过1000次......)。并且,我想确保所有10个元素至少被选择一次。有没有办法在Python中做到这一点?

random.choice没有帮助我...(或者,至少,我不知道如何使用它)。

4 个答案:

答案 0 :(得分:1)

您可以从克隆列表开始,确保每个列表至少在新列表中一次,这样可以模拟以概率1选择至少一个。

然后在范围循环中使用random.choice从列表中随机选择你的次数。

import random

your_number = 1000
old_list = [1,2,3,4,5,6,7,8,9,10]
new_list = list(old_list)

for x in range(your_number):
    new_list.append(random.choice(old_list))

如果您不喜欢可预测位置的数字,请使用random.shuffle增加熵:

random.shuffle(new_list)

答案 1 :(得分:1)

正如我在评论中提到的,如果它是真正随机的,并且它迭代了一定次数,那么并非100%确定所有项目至少被选择一次,不过如果你在列表上做了1000多次10件物品,当然很可能是他们的。为了100%确定所有项目都被选中一次,你必须施加一些排除完全随机性的规则。但是如果你不想这样做,你可以设置你的最小随机选择数,如果由于某种原因没有选择所有的元素,它将一直持续到它们为止。

import random
original_list = [1,2,3,4,5,6,7,8,9,10]
list = original_list[:]
minimum_iterations = 1000

while minimum_iterations > 0:  
    choice = random.choice(list)
    print(choice)
    if choice in original_list:
        original_list.remove(choice)
    minimum_iterations = minimum_iterations - 1

while len(original_list) > 0: # only executes if items remain unchosen
    choice = random.choice(list)
    print(choice)
    if choice in original_list:
        original_list.remove(choice)

这又不是完全随机的,因为它一直持续到每个项目被选中;但这是我能想到的最随意的方式来完成你原来的问题。

另一种解决方案,如果你愿意稍微“分配”随机性,那就是让它随机选择每个列表值一次,直到选中所有列表值,然后继续这样做以获得总迭代次数。这样可以保证每个值的选择次数相同,但顺序是随机的。

答案 2 :(得分:1)

将我的答案从评论转到帖子。

从统计上来说,如果迭代一个包含十个元素的数组一千次,每个元素将被选择一次。那么为什么不做这样的事呢?经过昂贵的操作后进行纠正以确保存在。

import random

data = range(10) # or really any iterable sequence
occurences = {}

for i in range(1000):
    choice = random.choice(data)

    # increment the occurence of the random choice by one
    # if the random choice was not found assume 0
    occurences[choice] = occurences.get(choice, 0) + 1

# error correction to ensure each element is counted once
# keep in mind this is extremely unlikely.

# iterate over each element in data that is not a key in occurences
for forgotten in (item for item in data if item not in occurences):
    choice = random.choice(tuple(data.keys()))

    # ensure each data element has been counted once
    # so simply borrow from another occurence
    occurences[choice] -= 1
    occurences[forgotten] = 1

答案 3 :(得分:0)

使用一套来跟踪已使用的物品;如果不是全部在集合中使用,则重新滚动。

摊销成本可以忽略不计(因为失败的可能性非常低),并且添加的跟踪是O(1),因此它不会改变O(n)时间复杂度。

这不是真正随机的,但是集合的内部随机性得以维持,并保证在保证所有十个术语的同时获得随机结果。

opts = range(10)  # or your list
result = []
while len(set(result)) != len(opts):
    for _ in range(1000):
        choice = random.choice(opts)
        result.append(choice)