Załóżmy, że mamy tylko jedną linię do pracy. Mamy ciąg "FO0" i chcemy wydrukować każdą postać losową ilość czasów i ponowne przerobić całe oświadczenie kolejnej losowej ilości czasu; W wyniku czego następuje:

ffooooo000 ffffffoo00 fffo00000000

Jak idziemy o tym, używając pętli lub czegoś podobnego?

O ile mam:

import random; x = "fo0"; print "".join(x for i in range(0,random.randrange(0,40)))

Wszystko to powoduje coś takiego jak "fo0fo0fo0fo0fo0fo0".

1
Noi Sek 5 grudzień 2011, 03:22

5 odpowiedzi

Najlepsza odpowiedź

Możesz użyć czegoś takiego jak następujące. Poniżej, s jest ciąg wejściowy, char_rand_max jest maksymalną liczbą razy, gdy pojedynczy znak jest powtarzany w słowie, a {x2}} jest maksymalną liczbą razy, aby uzyskać słowo. Każda postać pojawia się przynajmniej raz, a jest co najmniej jedno słowo.

import random

def rand_print(s, char_rand_max, str_rand_max):
    for i in range(random.randint(1, str_rand_max)):
        print ''.join([c*random.randint(1, char_rand_max) for c in s]),
    print

Przykłady:

>>> s = 'fo0'
>>> rand_print(s, 5, 5)
fffoooo0000

>>> rand_print(s, 5, 5)
fo000 fffffooo00000 ffooo00000 fffooo00 fffo0

>>> rand_print(s, 5, 5)
ffffo00 fffffooo00000 fffffo00000

Rozwiązanie jednokreskowe

Możesz oczywiście zrobić to wszystko w jednej linii, jeśli chcesz. Zamiast zgnieść funkcję z góry w jedną linię, możesz wykonać następujące czynności:

from random import randint as ri; x = 'fo0'; \
    print ' '.join([''.join([c*ri(1, 5) for c in x]) for i in range(ri(1, 5))])

Zauważ, że dodałem przerwę liniową, aby uczynić go bardziej czytelnym w odpowiedziach. Ponadto, w przeciwieństwie do powyższego rozwiązania, maksymalna liczba powtórzeń znaków i słów jest trudna na pięć.

4
David Alber 5 grudzień 2011, 04:26

Możesz użyć:

"".join(x[random.randrange(0, len(x))] for i in xrange(0, random.randrange(0,40)))
1
srgerg 4 grudzień 2011, 23:30

Moduł random ma funkcję o nazwie choice. Możesz go użyć w ten sposób:

import random as rand


def makeStr(chars, length):
    outs = ''
    for i in range(length):
        outs += rand.choice(chars)
    return outs


chars = ['f', 'o', '0']
length = 16

for i in range(0, 20):
    print makeStr(chars, length)

... i jakieś przykładowe wyjście:

OOFO0FOFILOO00O0OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOFOFOO0OO 0FO0OOFFFFOFO0FO OUOOO0OOF0FO0OOOO 0OOOFOOFO0FO0OFOFO FF0OFF00OOK

Edytuj: Mogłem źle zrozumieć problem. Jeśli ten wyjście nie jest tym, czego szukałeś, nie używaj mojego kodu.

1
Brigand 4 grudzień 2011, 23:35

To zrobi to, co chcesz, po prostu wywołaj metodę x Liczba razy dla x Liczba powtórzeń.

import random

def random_word(s, rand_range, rep):
     return " ".join("".join(ch*int(random.randrange(1,rand_range)) for ch in s) for _ in xrange(rep))


print random_word(x,5, 4)

Output: 
ffffoooo0000 ffffoooo000 fffooo000 fffoo00

Powodem, dla którego twoja metoda nie działa, jest dlatego, że po prostu wydrukowałeś "fo0" out, range(0,random.randrange(0,40).

Gruntownie:

[x for i in range(0,10)]

Jest tym, co robiłeś, który wydrukuje x, range(0,10).

1
Serdalis 5 grudzień 2011, 02:53

Jeśli próbujesz wydrukować między 0 i N razy losowo wybrany znak w zestawie znaków, będziesz chciał wykonać drobny poprawek do swojego kodu.

Culprit to:

"".join(x for i in range(0,random.randrange(0,40)))

Który mówi "Wyprodukuj losową liczbę kopii x i połączone je".

Być może to, czego chcesz, to:

"".join(x[random.randrange(len(x))] for i in range(random.randrange(40))

Który mówi "Wybierz losową liczbę losowych rysowanych z x i połącz je".

0
André Caron 4 grudzień 2011, 23:29