7
respostas

" seed() " que loucura não aleatória é essa?

Olá pessoal, tudo bem ?

Dei uma lida em outros tópicos do forúm sobre o mesmo tema, li documentação e vi também o vídeo sobre números aleatórios do Ciência todo dia apresenatdo pelo Pedro Loos que foi gravado em parceria com a Alura, e ainda assim estou com MUUUUITA dúvidas sobre o seed, alguém poderia tentar me explicar de uma forma diferente ou me recomendar algum conteúdo na neet?

Eu entendi que o seed é um número randômico (pseudo-randômico ) .

Temos o o método randrange() onde sempre que o mesmo é chamado, é mostrado valores diferentes, isso dentro dos que eu limitei (de forma randômica)

Ai temos o seed(), que estabelece um valor "fixo"/"inicial na minha randomização garantindo que a amostra a ser randomizada comece à partir do ponto N especificado. (número que eu defini como base no meu seed), até ai beleza, porém quando rodo o código sempre me é gerado os mesmos 8 valores! e isso não entra na minha cabeça, pq se eu defini seed(9), numa amostra de numeros randomicos de 0 a 11 ele não deveria me gerar numeros aleatórios a partir de 9? no caso do 9 ao 10? fiquei bem confusa com isso

Meu código:

from random import randrange as rr
 from random import seed as sd
sd(5)
rr(0,11)

saida: 10
notas_matematica = []

for notas in range(8):
  notas_matematica.append(rr(0,11))
notas_matematica

saida:  [8, 0, 7, 3, 10, 0, 2, 1]

Essa saida " [8, 0, 7, 3, 10, 0, 2, 1] " é sempre a mesma, primeiro porquê o primeiro número começou com 8 e não com 10 como foi definido do seed? e segundo, porque é mostrado outros números aleatórios que são antecessores ao 10?

7 respostas

Oi! Se eu entendi sua pergunta, a questão é a seguinte: O computador tem um algoritmo para a geração de números pseudo-aleatória, não são aleatórios de verdade porque são consequência de formulas matemáticas. Para saber poder repetir o resultado temos que garantir o mesmo seed. Tem um vídeo que explica bem a questão:

https://youtu.be/f4sE1r3UL4E

Olá Jéssica,

Como o Eduardo respondeu acima, sequências numéricas pseudo-aleatórias não são de fato aleatórias: a partir de um valor inicial, que é o seed, você gera uma sequência com base em uma fórmula matemática, no intervalo definido. Para um mesmo seed, a sequência será sempre a mesma, por isso os valores exibidos são sempre os mesmos e na mesma ordem: no código postado, o valor do seed é 5, ou seja, enquanto o seed for 5, a sequência pseudo-randômica gerada é sempre a mesma e na ordem que está aparecendo.

Sobre a questão dos valores em si, o seed não é o primeiro valor da sua sequência. O seed é um parâmetro que vai dizer qual será a sequência pseudo-aleatória gerada. Portanto, se o seed é 9, como você chegou a citar na pergunta, não significa que a sequência começa a partir de 9, mas sim que uma sequência será gerada usando o seed 9 como valor que determinará a sequência pseudo-randômica. O que define a faixa de números que serão gerados é o randrange.

Espero que tenha ajudado.

Para complementar o primeiro comentário: então para que serve o seed na prática? porque com meu deu o mesmo que a moça acima, porque colocar com o seed (por exemplo 8 ou 10), ainda não entendi.

Heber,

O seed serve para você garantir uma sequência específica, mas que ao mesmo tempo cumpre todos os requisitos matemáticos para ser considerada pseudo-aleatória. O mesmo seed vai sempre gerar a mesma sequência, então se você rodar o mesmo código que a Jéssica, o resultado vai ser de fato o mesmo.

Nesse exemplo apresentado, o seed em si não é tão importante. Por exemplo, pode tirar o seed e rodar várias vezes: você verá que nesse caso, as sequências geradas são todas diferentes, poeque não há um parâmetro de seed dizendo que deseja-se uma sequência específica.

Na prática, o seed é útil quando você quer gerar sequências pseudo-aleatórias, mas que ao mesmo tempo sejam conhecidas, para que você possa fazer diversos testes com elas. Com o seed você controla os dados para fazer testes, gerando uma sequência que ao mesmo tempo é conhecida, mas que é considerada pseudo-aleatória.

Bom dia, Executei no idle no python no meu pc e fiz a mesma coisa no Colab do Google.

Idle python abaixo:

from random import randrange, seed
seed(11)
notas_matematica = []
for notas in range(8):
    notas_matematica.append(randrange(0,11))
notas_matematica
[8, 7, 7, 8, 9, 3, 2, 8]

E depois fiz a mesma coisa no colab

from random import randrange, seed
seed(11)
notas_matematica = []

for notas in range(8):
  notas_matematica.append(randrange(0,11))


notas_matematica

[0, 9, 6, 7, 10, 9, 10, 2]

Eu até tirei o print pra não restar dúvida (pena que não dá pra enviar por aqui), mas os resultados são diferentes, mas tem alguns números que se repetem na lista do Google e do idle: 7 e 9 (mas é isso que o seed quer dizer? se eu colocar o mesmo seed para listas que tenham o mesmo "raio" por exemplo do 0 ao 10, ele tem a probabilidade maior de chegar aos mesmos números, por que ela não tem um padrão) Já entendi porque é pseudo-aleatório, mas mesmo assim os números não dão os mesmos, mesmo sendo raios iguais (claro que pode acontecer de dar o mesmo, mas no meu exemplo não deu a mesma sequência e olha que o range é o mesmo e o randrange é o mesmo também.)

Testei fazer como o da Jéssica, ele não exatamente o mesmo, mas alguns valores deu parecido com o da Jéssica, só que ele atribuiu valores de um outro seed, olha só.

seed(5)
notas_matemática = []

for notas in range(8):
  notas_matematica.append(randrange(0,11))

notas_matematica

[0, 9, 6, 7, 10, 9, 10, 2, 9, 4, 5, 10, 8, 0, 7, 3, 9, 4, 5, 10, 8, 0, 7, 3]

Ele repetiu os valores da sequência anterior de um seed diferente, que eu tinha definido nesse acima (mas não sei porque deu essa sequência de mais de 8 números.

seed(11)
notas_matematica = []

for notas in range(8):
  notas_matematica.append(randrange(0,11))


notas_matematica
[0, 9, 6, 7, 10, 9, 10, 2]

e incluiu valores parecidos com o da Jéssica: depois de repetir a sequência anterior de um seed diferente ele incluiu: 9, 4, 5, 10, 8, 0, 7, 3, 9, 4, 5, 10, 8, 0, 7, 3

Mas percebi algo interessante nessa sequência ele meio que "voltou no tempo", pois ele exibiu no finalzinho: o 8,0,7, 3 .

Já entendi. testei sozinho aqui já sei qual foi meu erro.