Jump to content

Como evitar que números gerados aleatoreamente se repitam


Anouk

Recommended Posts

Bom dia!

Antes de mais devo desde já dizer que já sei que o meu código é uma m****, mas eu comecei há pouco tempo a aprender, num curso profissional, estou a dar os primeiros passos e estou a tentar manter tudo o mais simples possível, a um nível que eu possa compreender.

Objetivo do desafio proposto: Criar um jogo da memória

Objetivo específico para esta questão que estou a colocar no fórum: Descobrir como é que posso gerar números aleatórios que não se repitam.

Contexto:

- Criei no formulário 16 PictureBox que vão receber imagem aleatórias.

- As imagens a serem escolhidas aleatoriamente guardei-as numa ImageList (rescurso do próprio programa), que as numerou de 0 a 15.

(Nota: Como preciso de 8 pares de imagens, coloquei 8+8, sendo as segundas repetidas mas com outro número.)

- Através do código (muito simples) já criado, consegui de facto inserir imagens aleatórias da ImageList nas PictureBox, mas o número que identifica a imagem repete-se mais que 1 vez, o que leva a que haja várias imagens iguais e outras que nem aparecem.

 

Código criado até agora:

Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        Randomize()

        Dim randInt As Integer

        randInt = CInt(Int((15 * Rnd())) + 0)
        PictureBox1.Image = ImageList1.Images(randInt)

        randInt = CInt(Int((15 * Rnd())) + 0)
        PictureBox2.Image = ImageList1.Images(randInt)

        randInt = CInt(Int((15 * Rnd())) + 0)
        PictureBox3.Image = ImageList1.Images(randInt)

        randInt = CInt(Int((15 * Rnd())) + 0)
        PictureBox4.Image = ImageList1.Images(randInt)

        randInt = CInt(Int((15 * Rnd())) + 0)
        PictureBox5.Image = ImageList1.Images(randInt)

        randInt = CInt(Int((15 * Rnd())) + 0)
        PictureBox6.Image = ImageList1.Images(randInt)

        randInt = CInt(Int((15 * Rnd())) + 0)
        PictureBox7.Image = ImageList1.Images(randInt)

        randInt = CInt(Int((15 * Rnd())) + 0)
        PictureBox8.Image = ImageList1.Images(randInt)

        randInt = CInt(Int((15 * Rnd())) + 0)
        PictureBox9.Image = ImageList1.Images(randInt)

        randInt = CInt(Int((15 * Rnd())) + 0)
        PictureBox10.Image = ImageList1.Images(randInt)

        randInt = CInt(Int((15 * Rnd())) + 0)
        PictureBox11.Image = ImageList1.Images(randInt)

        randInt = CInt(Int((15 * Rnd())) + 0)
        PictureBox12.Image = ImageList1.Images(randInt)

        randInt = CInt(Int((15 * Rnd())) + 0)
        PictureBox13.Image = ImageList1.Images(randInt)

        randInt = CInt(Int((15 * Rnd())) + 0)
        PictureBox14.Image = ImageList1.Images(randInt)

        randInt = CInt(Int((15 * Rnd())) + 0)
        PictureBox15.Image = ImageList1.Images(randInt)

        randInt = CInt(Int((15 * Rnd())) + 0)
        PictureBox16.Image = ImageList1.Images(randInt)

    End Sub

End Class 

 

Gente, eu não estou a pedir que me façam o trabalho todo. Apenas que me tentem ajudar nesta questão específica e com uma solução o mais simples possível.

Pode até haver uma instrução qualquer que evita que os números se repetiam, mas eu desconheço.

Agradeço a quem puder ajudar.

Edited by M6
Formatação de código.
Link to comment
Share on other sites

Já lá vão muitos anos desde o VB, mas espero poder ajudar.

Antes de mais o Randomize só deve ser feito uma única vez, no inicio do programa. Se tens no Load, pode acontecer que executes isso mais de uma vez.

Depois, se bem me recordo, o Rnd devolve um número entre 0 e 1 (0 <= Rnd < 1), pelo que a fórmula deverá ser

randInt = Int(16 * Rnd)

Para garantires que o valor não se repete, basta teres uma lista/array em que vais guardando os valores que já foram saindo e, caso exista uma repetição, pedes um novo número.

10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Link to comment
Share on other sites

  • 1 month later...

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.