2
respostas

Range gerando números maiores que o último numero.

Ao executar o código a seguir, ele gera números superiores a 60 (por exemplo, 81 69 25 59 83. Alguém consegue me explicar por que isso ocorre, já que eu tenho o parâmetro de ínicio, 1, o final, 61 (nesse caso deveria ser até 60 o último número gerado), e o terceiro, que "Pula" de 10 em 10?

import random

for i in range(1,61,10):
  print(int(random.random()*100))
2 respostas

Olá como vai Rogério.

Nesse casso você não colocou nenhuma restrição pros valores, a função random.random() deve gerar um número entre 0 e 1.

Recomendo o uso de uma outra função para sortear número aleátorios que estão entre um valor específico:

import random

for i in range(5):
  print(random.randrange(1, 60))

A função randrange nesse caso em específico sorteia um numero entre 1 e 60

Oioi Rogério, tudo bem com você?

Quando estamos trabalhando com a função range() na estrutura do for, estamos limitando o alcance de repetição, definindo uma sequência numérica em que ele pode trabalhar. Essa sequência numérica pode ter diversas declarações, e uma delas é informando o valor de início (start), fim (stop) e o passo (step) que esse número vai ser gerado. Para melhor visualizar isso, alterei a função print() do seu código para vermos como a estrutura for está trabalhando.

Código:

import random
for i in range(1,61,10):
  print("o número aleatório para i={} é {}".format(i, int(random.random()*100)))

Resultado:

o número aleatório para i=1 é 38
o número aleatório para i=11 é 93
o número aleatório para i=21 é 41
o número aleatório para i=31 é 34
o número aleatório para i=41 é 19
o número aleatório para i=51 é 62

O que está acontecendo é que sua função range() está limitando a estrutura for, e não a sua geração de números aleatórios. A função random() retorna um número do tipo float no alcance entre 0.0 e 1.0, e mesmo que você torne o número inteiro ao multiplicar por 100, o alcance permanecerá o mesmo (no caso, entre 0 e 100).

Quando queremos gerar um número inteiro aleatório utilizando a biblioteca random em python, e limitando seu alcance, podemos utilizar a função randrange(), que pode ser colocada nesses três formatos:

numero_aleatorio = randrange(stop) #Modo 01
numero_aleatorio = randrange(start, stop) #Modo 02
numero_aleatorio = randrange(start, stop, step) #Modo 03

O Modo 01 apresenta a declaração utilizando apenas o número que queremos que a função random finalize (stop), e o valor inicial padrão é dado como zero. O Modo 02 apresenta a declaração informando o valor de início (start) e fim (stop) da função e o Modo 03 apresenta o mesmo formato do 02, com o adicional que podemos colocar o passo (step) que esse número vai ser gerado. A função randrange() retorna então um valor inteiro no intervalo start <= numero_aleatorio < stop, portanto, não é necessário a transformação para inteiro.

Desse modo, para que o seu código tenha o funcionamento desejado, utilizando a função randrange(), você pode estruturá-lo da seguinte maneira:

import random

for i in range(6):
  print(random.randrange(1,61,10))

Resultado:

21
41
1
1
31
31

Perceba que foram retornados 6 resultados, assim como anteriormente, e o número aleatório é dado naquele alcance e passo definido, antes mostrado por i :)

Caso tenha interesse em saber mais sobre a biblioteca random, te recomendo a leitura da documentação do Python sobre essa biblioteca. Caso queira se aprofundar ainda mais sobre a Linguagem Python, recomendo a formação Python e orientação a objetos na alura!

Em caso de dúvidas, me coloco à disposição.

Grande abraço e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software