Admitamos que nos pedem para gerar uma sequência com n números inteiros todos no intervalo [a,b]. Em função do que sabemos, o mais natural é gerar os números um a um e ir guardando o resultado no único contentor que já conhecemos (em breve, tomaremos conhecimento com outros...). Claramente, do que foi dito estamos perante um padrão de programação do tipo ciclo - acumulador. Daí o código:
01.
def
gera_tuplos_n(n,a,b):
02.
"""Gera um tuplo com n inteiros entre a e b."""
03.
res
=
()
# <-- o acumulador
04.
for
i
in
range(n):
# <-- o ciclo
05.
# gera número
06.
num
=
random.randint(a,b)
07.
# guarda número
08.
res
+
=
(num,)
09.
return
res
1.
def
gera_tuplos_n(n,a,b):
2.
"""Gera um tuplo com n inteiros distintos entre a e b."""
3.
res
=
()
4.
for
i
in
range(n):
5.
num
=
random.randint(a,b)
6.
if
num
not
in
res:
7.
res
+
=
(num,)
8.
return
res
01.
def
gera_tuplos_n_diff(n,a,b):
02.
"""Gera um tuplo com n inteiros entre a e b, todos diferentes"""
03.
res
=
()
04.
i
=
0
05.
while
i < n:
06.
num
=
random.randint(a,b)
07.
if
num
not
in
res:
08.
res
+
=
(num,)
09.
i
+
=
1
10.
return
res
1.
def
gera_tuplos_n_diff(n,a,b):
2.
"""Gera um tuplo com n inteiros entre a e b, todos diferentes"""
3.
res
=
()
4.
while
len(res) < n:
5.
num
=
random.randint(a,b)
6.
if
num
not
in
res:
7.
res
+
=
(num,)
8.
return
res
1.
print
(gera_tuplos_n_diff(
10
,
5
,
10
))
01.
def
gera_tuplos_n_diff_b(n,a,b):
02.
"""Gera um tuplo com n inteiros entre a e b, todos diferentes"""
03.
assert
n <
=
(b
-
a
+
1
),
'Um...números a menos para o tamanho do tuplo.'
04.
res
=
()
05.
while
len(res) < n:
06.
num
=
random.randint(a,b)
07.
if
num
not
in
res:
08.
res
+
=
(num,)
09.
return
res
1.
def
gera_tuplos_n_diff(n, a,b):
2.
"""Gera um tuplo com n inteiros entre a e b, todos diferentes"""
3.
assert
n <
=
(b
-
a
+
1
),
'Um...números a menos para o tamanho do tuplo.'
4.
return
random.sample(range(a,b
+
1
),n)
Já agora: se em vez de inteiros fossem números reais então os métodos a usar seriam o random, para o intervalo [0,1), ou o uniform, para o intervalo [a,b]. Mas o resto não se alterava.
E agora sim, deste já nos livrámos.
Vamos passar para outro tipo de problema. E se em vez de números nos pedem para fabricar aleatoriamente uma sequência de ADN. Como sabemos este tipo de sequência pode ser representado por uma cadeia de caracteres em que os valores possíveis para cada posição é uma de entre as quatro bases, ‘A, ‘T’, ‘C’, e ‘G’. Mas tirando esse aspecto o problema do ponto de vista informático segue o mesmo padrão do problema anterior: ciclo + acumulador. A única questão a resolver prende-se com a geração das bases. Mas para isso temos o método choice!
1.
def
gera_adn(n):
2.
"""Gera uma cadeia de ADN de comprimento n."""
3.
adn
=
''
4.
for
i
in
range(n):
5.
base
=
random.choice(
'ATCG'
)
6.
adn
+
=
base
7.
return
adn
1.
def
gera_adn(n):
2.
"""Gera uma cadeia de ADN de comprimento n."""
3.
adn
=
''
4.
for
i
in
range(n):
5.
base
=
random.choice(
'AATCG'
) <
-
-
dois As!!
6.
adn
+
=
base
7.
return
adn
1.
def
gera_tarta(n):
2.
"""Gera uma sequência de n movimentos aleatórios de uma tartaruga."""
3.
tarta
=
''
4.
for
i
in
range(n):
5.
passo
=
random.choice(
'NSEO'
)
6.
tarta
+
=
passo
7.
return
tarta
01.
def
passeio_tarta(posx, posy, tam_passo,cor,caminho):
02.
"""Simula o caminha da tartaruga num espaço reticulado."""
03.
# inicializa
04.
turtle.showturtle()
05.
turtle.pencolor(cor)
06.
turtle.fillcolor(cor)
07.
turtle.shape(
'turtle'
)
08.
turtle.penup()
09.
turtle.goto(posx, posy)
10.
turtle.pendown()
11.
# passeia
12.
for
comando
in
caminho:
13.
if
comando
=
=
'N'
:
14.
turtle.setheading(
90
)
15.
turtle.forward(tam_passo)
16.
elif
comando
=
=
'S'
:
17.
turtle.setheading(
270
)
18.
turtle.forward(tam_passo)
19.
elif
comando
=
=
'E'
:
20.
turtle.setheading(
0
)
21.
turtle.forward(tam_passo)
22.
elif
comando
=
=
'O'
:
23.
turtle.setheading(
180
)
24.
turtle.forward(tam_passo)
25.
else
:
26.
# Ignorar
27.
continue
28.
turtle.hideturtle()
29.
30.
def
main_tarta(n, posx,posy,tam_passo,cor):
31.
caminho
=
gera_tarta(n)
32.
passeio_tarta(posx,posy,tam_passo,cor,caminho)
Podemos agora brincar um pouco. Por exemplo, admitir que a nossa tartaruga privilegia ir para oeste e para norte:
1.
def
gera_tarta(n):
2.
"""Gera uma sequência de n movimentos aleatórios de uma tartaruga."""
3.
tarta
=
''
4.
for
i
in
range(n):
5.
passo
=
random.choice(
'NNNSEOOO'
)
6.
tarta
+
=
passo
7.
return
tarta
01.
def
passeio_tarta(posx, posy, tam_passo,cor,caminho):
02.
"""Simula o caminha da tartaruga num espaço reticulado."""
03.
# inicializa
04.
turtle.showturtle()
05.
turtle.pencolor(cor)
06.
turtle.fillcolor(cor)
07.
turtle.shape(
'turtle'
)
08.
turtle.penup()
09.
turtle.goto(posx, posy)
10.
turtle.pendown()
11.
# passeia
12.
for
comando
in
caminho:
13.
if
comando
=
=
'N'
:
14.
turtle.setheading(
90
)
15.
turtle.forward(tam_passo)
16.
elif
comando
=
=
'S'
:
17.
turtle.setheading(
270
)
18.
turtle.forward(
0.5
*
tam_passo)
19.
elif
comando
=
=
'E'
:
20.
turtle.setheading(
0
)
21.
turtle.forward(tam_passo)
22.
elif
comando
=
=
'O'
:
23.
turtle.setheading(
180
)
24.
turtle.forward(
0.5
*
tam_passo)
25.
else
:
26.
# Ignorar
27.
continue
28.
turtle.hideturtle()
01.
def
gera_tarta(n):
02.
"""Gera uma sequência de n movimentos aleatórios de uma tartaruga."""
03.
tarta
=
''
04.
for
i
in
range(n):
05.
passo
=
random.choice(
'NNNSXEOOO'
)
# <-- um X
06.
tarta
+
=
passo
07.
return
tarta
08.
09.
def
passeio_tarta(posx, posy, tam_passo,cor,caminho):
10.
"""Simula o caminha da tartaruga num espaço reticulado."""
11.
# inicializa
12.
turtle.showturtle()
13.
turtle.fillcolor(cor)
14.
turtle.shape(
'turtle'
)
15.
turtle.penup()
16.
turtle.goto(posx, posy)
17.
turtle.pendown()
18.
# passeia
19.
for
comando
in
caminho:
20.
if
comando
=
=
'N'
:
21.
turtle.pencolor(
'red'
)
22.
turtle.setheading(
90
)
23.
turtle.forward(tam_passo)
24.
elif
comando
=
=
'S'
:
25.
turtle.pencolor(
'green'
)
26.
turtle.setheading(
270
)
27.
turtle.forward(tam_passo)
28.
elif
comando
=
=
'E'
:
29.
turtle.pencolor(
'blue'
)
30.
turtle.setheading(
0
)
31.
turtle.forward(tam_passo)
32.
elif
comando
=
=
'O'
:
33.
turtle.pencolor(
'yellow'
)
34.
turtle.setheading(
180
)
35.
turtle.forward(tam_passo)
36.
else
:
37.
# Ignorar
38.
turtle.pencolor(
'black'
)
39.
turtle.dot(
6
)
40.
continue
41.
turtle.hideturtle()
Sem comentários:
Enviar um comentário