簡體   English   中英

Select 列表中的隨機變量 Python

[英]Select random variables from list with limit Python

我需要為 3 個不同的對象生成唯一的隨機列表,每個 object 可以在每個 lis 上出現一次,每個代碼的長度必須為 5。

import random 
#generate random codes
def generator(code, objects):
    

    for i in range(len(code)):
        x = random.choices(objects)
        code[i] = x[0]
        

#Check if code is unique
def isSame(code, list):
    if code not in list:
        return False
    else:
        return True

#If code is unique, append it to the codeList and increase counter by 1
codeCount = 0
def listAppend(code, list):
    if isSame(code,list) == True:
        print('This code is not unique')
    else:
        list.append(code)
        global codeCount
        codeCount += 1



if __name__ == '__main__':
    codeList = []
    desiredCount = 12
    
    while codeCount != desiredCount:
        code = [None]*5
        objects = ['a','b','c','d','e','f','g']
        
        generator(code, objects)
        listAppend(code,codeList)
   
    print(codeList)

這給了我隨機的唯一列表,但是我想不出如何讓每個 object 在每個唯一列表中只出現一次。

例如 ['a', 'g', 'g', 'a', 'e'] ==> 'g' 和 'a' 在我需要它們只出現一次的地方重復了兩次。 比如,['a','b','c','d','e']

誰能想到一個好的方法來做到這一點? 謝謝!!


編輯:每個代碼的固定長度必須為 5。另外我正在使用 random.choices 來使用它的概率參數。

我會這樣做的方式是:

from random import randrange as rr
Alphabet="abcdefghijklmnopqrstuvwxyz"
def generate(length):
    code=[]
    for _ in range(length):
         random_number=rr(0,len(Alphabet))
         if Alphabet[random_number]not in code:
             code.append(Alphabet[random_number])
    return code

這會從元組/列表/字符串(在我的情況下是一個字母字符串)生成一個隨機元素,並檢查該元素是否已經在代碼中,如果沒有,那么它將被添加到代碼中,代碼的長度由參數決定。

這將從源中生成所有可能的 3 個唯一元素選擇。

import itertools
list(itertools.combinations('abcdefg',3))

[('a', 'b', 'c'),
 ('a', 'b', 'd'),
 ('a', 'b', 'e'),
 ('a', 'b', 'f'),
 ('a', 'b', 'g'),
 ('a', 'c', 'd'),
 ('a', 'c', 'e'),
 ('a', 'c', 'f'),
 ...
 ('d', 'f', 'g'),
 ('e', 'f', 'g')]

對於尺寸 5,它將是這個列表

 list(itertools.combinations('abcdefg',5))

[('a', 'b', 'c', 'd', 'e'),
 ('a', 'b', 'c', 'd', 'f'),
 ('a', 'b', 'c', 'd', 'g'),
 ('a', 'b', 'c', 'e', 'f'),
 ('a', 'b', 'c', 'e', 'g'),
 ('a', 'b', 'c', 'f', 'g'),
 ('a', 'b', 'd', 'e', 'f'),
 ('a', 'b', 'd', 'e', 'g'),
 ('a', 'b', 'd', 'f', 'g'),
 ('a', 'b', 'e', 'f', 'g'),
 ('a', 'c', 'd', 'e', 'f'),
 ('a', 'c', 'd', 'e', 'g'),
 ('a', 'c', 'd', 'f', 'g'),
 ('a', 'c', 'e', 'f', 'g'),
 ('a', 'd', 'e', 'f', 'g'),
 ('b', 'c', 'd', 'e', 'f'),
 ('b', 'c', 'd', 'e', 'g'),
 ('b', 'c', 'd', 'f', 'g'),
 ('b', 'c', 'e', 'f', 'g'),
 ('b', 'd', 'e', 'f', 'g'),
 ('c', 'd', 'e', 'f', 'g')]

通過僅將 object.remove() 行添加到 function 生成器,我設法以我想要的方式獲得解決方案。

通過刪除附加到代碼列表的任何內容,就可以消除重用。

#generate random codes
def generator(code, objects):
    

    for i in range(len(code)):
        x = random.choices(objects)
        code[i] = x[0]
        
        #new line
        objects.remove(x[0])
        

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM