2015-07-31 1 views
0

J'essaie de générer des données aléatoires pour 'ACDEFGHIKLMNPQRSTVWY' sous une forme 3-mer (comme, AEF) en utilisant le script suivant, mais dans les sorties, j'ai eu beaucoup de 3-mères similaires. Pourriez-vous s'il vous plaît me conseiller sur la façon de faire, ne pas obtenir des résultats similaires ou supprimer le même 3-mer?Générer des données aléatoires

Merci à l'avance, Berk

import random 

def random_AA_seq(length): 
    return ''.join(random.choice('ACDEFGHIKLMNPQRSTVWY') for i in range(length)) 

list_size = 10000 
lengths = [] 

for j in range(list_size): 
    a = int(random.normalvariate(3, 0)) 
    print random_AA_seq(a) 
+0

similaires comme dans 'ABC + ABC' ou similaire à' AAA'? –

+0

Similaire à ABC + ABC. J'ai besoin de AAA, mais pas le (AAA + AAA) – Berk

Répondre

0

Juste

''.join(random.choice(string.ascii_uppercase) for _ in range(3)) 

devraient être bien

+0

S'il vous plaît expliquer pourquoi cela fonctionne. – simbabque

1

Pour enlever les mêmes éléments, il suffit de faire un jeu:

print set(random_AA_seq(a)) 

Pour obtenir toutes permutations possibles, vous pouvez également utiliser itertools ...

from itertools import permutations 

length = 3 
print permutations('ACDEFGHIKLMNPQRSTVWY', length) 

... et choisir vos 3-mères au hasard par la suite.

+1

Et 'list (itertools.combincations (..., 3))' si OP n'aime pas les trimères "AAA" –

+0

@qarma: 'itertools.permutations' exclut déjà plusieurs valeurs dans le même jeu de résultats :) – Cipher

1

Par commentaires:

alphabet = "ACDEFGHIKLMNPQRSTVWY" 
all_trimers = map("".join, itertools.product(* [alphabet] * 3)) 
a_few_distinct_trimers = random.sample(all_trimers, 42) 
+0

J'ai besoin AAA mais pas AAA + AAA – Berk

+0

mis à jour par req's –

0

réponse Mise à jour, le script suivant retourne une liste de la longueur de les employés de 3M nécessaire. Chaque 3mer se produira dans la liste une fois:

import random 

def random_3mers(length): 
    seqs = set() 

    while len(seqs) < length: 
     seqs.add("".join(random.sample("ACDEFGHIKLMNPQRSTVWY", 3))) 

    lseqs = list(seqs) 
    random.shuffle(lseqs) 
    return lseqs 

for three_mer in random_3mers(10): 
    print three_mer 

Pour une longueur de 10, le type de sortie suivant est affiché:

MKY 
KWV 
PRY 
WKQ 
YGI 
ANQ 
GFL 
RQE 
SCN 
GRY 
+0

Oui, mais j'ai besoin des articles 3-mer (comme AAA, ABC et ...) – Berk

+0

Pas de problème, alors passez juste 3 comme votre longueur. –

+0

Encore une fois, je fais face à beaucoup de 3-mers dupliqués comme ACF, ACF, ACF MNP, MNP et .... – Berk