0

这与随机抽样有关。我正在使用 random.sample(number,5) 从数字中包含的数字范围内返回随机数列表。我使用 while i < 100 返回一百组五个数字。要检查重复项,我正在使用:

if len(numbers) != len(set(numbers)):

识别具有重复项的集合,然后使用 random.sample(number,5) 尝试进行另一次随机化以将集合替换为重复项。我似乎得到了大约 8% 的重新随机分配(使用打印语句来说明哪个数字被重复),但似乎遗漏了大约 5%。我做错了什么?实际代码如下:

while i < 100:
    set1 = random.sample(numbers1,5)
if len(set1) != len(set(set1))
    print('duplicate(s) found, random selection repeated')
set1 = random.sample(numbers1,5)

在另一个例程中,我尝试执行与上述相同的操作,但通过添加相同的集合来搜索两组中的重复项,并将 set2 替换为 set1。这给出了相同类型的故障。set2 例程缩进并放置在上述例程的正下方。而 i < 100: 对于 set2 不重复。我希望我已经清楚地解释了我的问题!

4

2 回答 2

0

您的代码中没有任何内容可以阻止第二个样本重复。如果你做了类似第二个while循环的事情怎么办?

while i<100:
    i+=1
    set1 = random.sample(numbers1,5)
    while len(set1) != len(set(set1)):
        print('duplicate(s) found, random selection repeated')
        set1 = random.sample(numbers1,5)

当然,您仍然缺少执行某些操作的代码部分……除此之外,如果没有完整的代码示例,很难说出您可能需要更改的内容。

编辑:这是来自评论的代码示例的工作版本:

def choose_random(list1,n):
    import random 
    i = 0 
    set_list=[]
    major_numbers=range(1,50) + list1
    print(major_numbers) 
    while i <n: 
        set1 =random.sample(major_numbers,5) 
        set2 =random.sample(major_numbers,2) 
        while len(set(set1)) != len(set1):
            print("Duplicate found at %i"%i)
            print set1
            print("Changing to:")
            set1 =random.sample(major_numbers,5) 
            print set1
        set_list.append([set1,set2])
        i +=1
    return set_list
于 2012-11-19T19:26:26.577 回答
0

您提供的代码显然有一些差距并且无法按原样工作,因此我无法确定您的错误到底在哪里,但是set1 = random.sample(numbers1,5)在循环结束后运行while(如果按照您的问题写成无限)会撤消您的所有操作以前做过,因为它会覆盖您设法设置set1的任何内容。

无论如何,random.sample应该给你一个无需更换的样品。如果你有任何重复,random.sample(numbers1, 5)那意味着你已经有重复numbers1。如果不应该是这种情况,您应该检查的内容numbers1并可能强制它包含唯一的所有内容,例如通过使用set(numbers1)

如果原因是你想要一些numbers1更高概率的元素,你可能想把它作为

set1 = random.sample(numbers1, 5)
while len(set1) != len(set(set1)):
    set1 = random.sample(numbers1, 5)

这可能是一个无限循环,但如果numbers1包含至少 5 个不同的元素,它将在某个时候退出循环。如果您不喜欢这个循环永远不会退出的理论可能性,您可能应该使用加权样本而不是random.sample, (在 stackoverflow 上有一些如何做到这一点的示例)并删除您已经从权重表。

于 2012-11-20T11:49:36.613 回答