PROBLEMA NO GERADOR DE Nº ALEATORIOS SEM REPETICAO
Olá boa tarde.
Estou a fazer um gerador de nºs aleatórios sem repetição, mas estou com 2 problemas simples que talvez me possam ajudar.
A transição de VB6 para .Net está a ser aos poucos; o que por sua vez possam se deparar com alguns problemas na linguagem que não sejam os + correctos.
Junto envio o código para que me possam ajudar.
No 1 problema : Quando escolhemos gerar nº aleatórios com um tamanho até 1000 nº X 1000 Linhas geradas, muitas das vezes nos aparecem em 1º lugar algumas repetições a quando do inicio da sua geração como mostra o exemplo em cima. ( o que pretendia é que isso não acontece-se)
No 2º problema : Quando geramos 1 só chave a barra de progresso não fica completa. ( Só fica se o nº de chaves >=2)
-Talvez esteja a fazer uma coisa errada que por inexperiência nesta lig. não consigo detectar.
Grato pela vossa atenção.
Programadorvb6
Cara eu to na Rua e sem VB mas tenta fazer um random para gerar nºs aleatórios
Dim Numero as integer
Dim Aleatorio as Random = New Random
For X = 1 to 1000
Numero = Aleatorio.next(1,1000)
Next
Este é o básico para se criar os nºs aleatórios.
Para evitar repetições, crie uma Collection ou um Array e joga cada nº criado lá dentro
então, no loop para criar os nºs aleatórios, faça um loop pela Collection ou Array e compare se o nº criado já existe dentro do Array. Se existir então ele não será adicionado ao Vetor e o programa criará outro nº aleatório.
Por fim Jogue o conteúdo do seu vetor dentro da ListBox.
Espero ter ajudado em alguma coisa.
Dim Numero as integer
Dim Aleatorio as Random = New Random
For X = 1 to 1000
Numero = Aleatorio.next(1,1000)
Next
Este é o básico para se criar os nºs aleatórios.
Para evitar repetições, crie uma Collection ou um Array e joga cada nº criado lá dentro
então, no loop para criar os nºs aleatórios, faça um loop pela Collection ou Array e compare se o nº criado já existe dentro do Array. Se existir então ele não será adicionado ao Vetor e o programa criará outro nº aleatório.
Por fim Jogue o conteúdo do seu vetor dentro da ListBox.
Espero ter ajudado em alguma coisa.
Olá PEGUDO.
Obrigado pela dica, mas sou um pouco inexperiênte em VB.Net
Para falar verdade ainda sei trabalhar pouco com collection (array) que o VB. net possui.
Se reparar ainda tem grande parte do código escrito em VB6..
Vou esperar que me possa facultar um exemplo.
Obrigado desde já pela ajuda.
Obrigado pela dica, mas sou um pouco inexperiênte em VB.Net
Para falar verdade ainda sei trabalhar pouco com collection (array) que o VB. net possui.
Se reparar ainda tem grande parte do código escrito em VB6..
Vou esperar que me possa facultar um exemplo.
Obrigado desde já pela ajuda.
Deixo aqui o código para que me possam ajudar.
Option Strict Off
Option Explicit On
Friend Class Form1
Dim N As Short [ô]Size of Array
Dim i As Short [ô]Array indexing
Dim x As Short
Dim pz As Integer
Dim DxD As Int16
Dim arr(100) As Object [ô]Array name
Dim Ans As String
Dim mensagem As String
[ô]//===== Sobre ===
Private Sub Sobre_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles Sobre.Click
On Error GoTo Sobre_Click_Error
MsgBox([Ô] ( 2010 )VSoft - Adaptação de código feito por : [Ô] & vbCrLf & vbCrLf & [Ô]==ProgramadorVB6 ==[Ô], MsgBoxStyle.Information, [Ô]Programmer[Ô])
On Error GoTo 0
Exit Sub
Sobre_Click_Error:
MsgBox([Ô]Erro [Ô] & Err.Number & [Ô] ( [Ô] & Err.Description & [Ô] )[Ô])
End Sub
[ô]//===== ===
[ô]//===== Exit ===
Private Sub Sair_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles Sair.Click
End
End Sub
[ô]//============
[ô]//===== Formulário===
Private Sub Form1_Load(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles MyBase.Load
Dim ips As Integer
For ips = 1 To 1000
Me.Caixa_Max.Items.Add(CStr(ips))
Me.Caixa_Min.Items.Add(CStr(ips))
[ô]size of array
Me.NLinhas.Items.Add(CStr(ips))
Me.NChaves.Items.Add(CStr(ips))
Next ips
Me.Caixa_Max.Text = CStr(1000)
Me.Caixa_Min.Text = CStr(1)
Me.NLinhas.Text = CStr(5)
Me.NChaves.Text = CStr(1)
End Sub
[ô]//=================
[ô]//===== Definir botão < ===
Private Sub Menos_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles Menos.Click
On Error Resume Next
Me.NLinhas.Text = CStr(Val(Me.NLinhas.Text) + 1)
End Sub
[ô]//=======================
[ô]//===== Definir botão > ===
Private Sub Mais_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles Mais.Click
On Error Resume Next
Me.NLinhas.Text = CStr(Val(Me.NLinhas.Text) - 1)
End Sub
[ô]//=====================
[ô]//===== Botão gerar nºs ===
Private Sub GerarN_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles GerarN.Click
Dim xsp As Integer
Dim valor As Double
If Val(Caixa_Max.Text) - Val(Caixa_Min.Text) + 1 >= Val(NLinhas.Text) Then
pz = 0
[ô] PercentX = 0
Me.Listagem.Items.Clear()
valor = 100 / Val(Me.NChaves.Text)
Progress.Minimum = 100 / Val(Me.NChaves.Text)
[ô]MsgBox(PercentX)
For xsp = 1 To Val(Me.NChaves.Text)
Chave.Text = [Ô][Ô]
Gerar()
Listagem.Items.Add(Me.Chave.Text)
pz = pz + 1
Voltas.Text = pz.ToString
Progress.Value = valor
valor = valor + Val(100 / Val(Me.NChaves.Text))
PercentG.Text = CStr(Math.Round((valor) - Val(100 / Val(Me.NChaves.Text)))) & [Ô]%[Ô]
Next xsp
Else
MsgBox([Ô]Tamanho da cadeia entre numeros terá que ser >= [Ô] & Val(NLinhas.Text))
Exit Sub
End If
Me.Progress.Value = [Ô]100[Ô]
PercentG.Text = [Ô]Completo![Ô]
End Sub
[ô]//============================
[ô]//===== Limpar Tudo (Zerar) ===
Private Sub Limpar_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles Limpar.Click
Dim ips As Integer
On Error GoTo Limpar_Click_Error
Me.Chave.Text = [Ô][Ô]
Me.Listagem.Items.Clear()
For ips = 1 To 1000
Me.Caixa_Max.Items.Add(CStr(ips))
Me.Caixa_Min.Items.Add(CStr(ips))
[ô]size of array
Me.NLinhas.Items.Add(CStr(ips))
Me.NChaves.Items.Add(CStr(ips))
Next ips
Me.Caixa_Max.Text = CStr(1000)
Me.Caixa_Min.Text = CStr(1)
Me.NLinhas.Text = CStr(5)
Me.NChaves.Text = CStr(1)
Me.Progress.Refresh()
Me.Progress.Value = Me.Progress.Minimum
Me.Progress.Visible = False
Me.Progress.Visible = True
[ô]Me.Progress.Value = [Ô]0[Ô]
Me.PercentG.Text = [Ô]0%[Ô]
Exit Sub
Limpar_Click_Error:
MsgBox([Ô]Erro [Ô] & Err.Number & [Ô] ([Ô] & Err.Description & [Ô])[Ô])
End Sub
[ô]//================================================
[ô]========================================
[ô]//==== Gerador elaborado por : ProgramadorVB6
[ô]========================================
Sub Gerar()
Dim j, i As Object
Dim num As Byte
Dim sim As Boolean
Dim MenorValor, MaiorValor As Integer
Dim Contador, Calculado As Integer
Dim Repetido As Boolean
Dim Resultado() As Integer
mensagem = [Ô][Ô]
sim = True
j = 1
On Error GoTo GerarN_Click_Error
N = CShort(Me.NLinhas.Text)
If Val(Me.Caixa_Min.Text) >= Val(Me.Caixa_Max.Text) Then
MsgBox([Ô]Tamanho inválido ![Ô], MsgBoxStyle.Exclamation, [Ô]Erro : [Ô])
Exit Sub
End If
Me.Chave.Text = [Ô][Ô]
MenorValor = Val(Me.Caixa_Min.Text)
MaiorValor = Val(Me.Caixa_Max.Text)
For Contador = 1 To Val(Me.NLinhas.Text)
System.Windows.Forms.Application.DoEvents()
[ô]Redimensionando array
ReDim Preserve Resultado(Contador)
[ô]Se for o primeiro numero a gerar,
[ô]não precisa verificar duplicidade
If Not (Contador = 1) Then
Do
[ô]Inicializando geração de
[ô]números aleatórios
Randomize()
[ô]Calculando próximo numero
Resultado(Contador) = CInt(Int((MaiorValor - MenorValor + 1) * Rnd() + MenorValor))
[ô]Verificando se o número já existe
For Calculado = 1 To (Contador - 1)
Repetido = (Resultado(Contador) = Resultado(Calculado))
If Repetido Then Exit For
Next
Loop While Repetido
Else
[ô]Gerando o primeiro número
Resultado(Contador) = CInt(Int((MaiorValor - MenorValor + 1) * Rnd() + MenorValor))
End If
[ô]String com os números gerados
mensagem = mensagem & Resultado(Contador) & IIf((Contador = Val(Me.NLinhas.Text)), [Ô][Ô], [Ô],[Ô])
Next
[ô]Esvaziando array
Erase Resultado
[ô]Mostra a chave
Chave.Text = mensagem
On Error GoTo 0
Exit Sub
GerarN_Click_Error:
MsgBox([Ô]Erro [Ô] & Err.Number & [Ô] ([Ô] & Err.Description & [Ô] )[Ô])
End Sub
[ô]//======================================================
End Class
Amigão, eu estava mexendo nesse projeto ontem, mas o cansaço me venceu, hoje vou continuar a trabalhar nele e ver se termino, dai eu posto aqui pra ver se te ajuda..
Obrigado
Obrigado
Obrigado.
beleza então, usa algum comunicador instantaneo ?
chegando em casa a gente troca um idéia.
to meio agarrado aqui, porque to com um problema de saúde..
Abraços
chegando em casa a gente troca um idéia.
to meio agarrado aqui, porque to com um problema de saúde..
Abraços
h2so4-programadorvb6@hotmail.com
Amigão fiz a adaptação, ja esta gerando normal e atualizando a ProgressBar.
Falta fazer o acabamento, veja ai por favor e qualquer coisa da um grito ai.
Ah sim eu esqueci de limpar a lista a cada Chave entao ali embaixo do FOR quando eu limpo a String tu pode limpar a Lista
[Ô]ListaFull.Clear()[Ô]
Falta fazer o acabamento, veja ai por favor e qualquer coisa da um grito ai.
Ah sim eu esqueci de limpar a lista a cada Chave entao ali embaixo do FOR quando eu limpo a String tu pode limpar a Lista
[Ô]ListaFull.Clear()[Ô]
Olá ZEROCAL.
Estive a testar o código e há a repetição de nºs no inicio de cada cadeia. (Tenta fazer 1000 nº gerados , por 1000 linhas/ ou até menos.)
Ex:
14,45,28,36,450,487,....
120,40,50,650,300...
120,30,25,47,32....
50,32,48,125,78,98....
O que eu pretendia é que o nº inicial(120) não seja repetido com a cadeia de cima.
Fiz outro código + simples embora demore um pouco + a gerar nº , mas ficquei preso novamente na repetição do 1º nº na cadeia.
Quanto á progressbar Beleza! Funfa! Thanks!
Obrigado desde já pela a tua ajuda.
Estive a testar o código e há a repetição de nºs no inicio de cada cadeia. (Tenta fazer 1000 nº gerados , por 1000 linhas/ ou até menos.)
Ex:
14,45,28,36,450,487,....
120,40,50,650,300...
120,30,25,47,32....
50,32,48,125,78,98....
O que eu pretendia é que o nº inicial(120) não seja repetido com a cadeia de cima.
Fiz outro código + simples embora demore um pouco + a gerar nº , mas ficquei preso novamente na repetição do 1º nº na cadeia.
Quanto á progressbar Beleza! Funfa! Thanks!
Public Class Form1
Public Sub GerarNumeros()
Dim Numero As Integer
Dim i As Integer
Dim Existe As Boolean
Dim Numeros(1000) As Integer
Dim Indice As Integer
Dim LimiteInferior As Integer
Dim LimiteSuperior As Integer
If Me.Minimo.Text <> [Ô][Ô] Then
LimiteInferior = Val(Minimo.Text)
Else
Minimo.Text = [Ô]1[Ô]
LimiteInferior = 1
End If
If Me.Maximo.Text <> [Ô][Ô] Then
LimiteSuperior = Val(Maximo.Text)
Else
Maximo.Text = [Ô]1000[Ô]
LimiteSuperior = 1000
End If
Randomize()
Indice = 0
While Indice < Val(Me.TamCadeia.Text) + 1
Numero = Int(Rnd(LimiteInferior) * LimiteSuperior)
If Indice = 0 Then
Indice = Indice + 1
Numeros(Indice) = Numero
Else
Existe = False
For i = 1 To Indice
If Numeros(i) = Numero Then
Existe = True
End If
Next
If Not Existe Then
Numeros(Indice) = Numero
Indice = Indice + 1
End If
End If
End While
For i = 1 To Indice - 1
If Val(TamCadeia.Text) > 1 Then
Chave.Text = Chave.Text & Numeros(i) & [Ô] - [Ô]
Else
Me.Chave.Text = Numeros(i)
End If
Next
Dim subString As String = Microsoft.VisualBasic.Left(Me.Chave.Text, (Len(Me.Chave.Text) - 2))
Me.Lista.Items.Add(subString)
[ô]Me.Lista.Items.Add(Me.Chave.Text)
Chave.Text = [Ô][Ô]
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim Linhas As Integer
[ô]Limpar caixa
Lista.Items.Clear()
For Linhas = 1 To Val(Me.NLinhas.Text)
GerarNumeros()
Me.NLConta.Text = Linhas
Next Linhas
End Sub
[ô]Ver 1º numero de uma cadeia
[ô]Ainda só está feito o percorrer linha a linha
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim Index As Integer = -1
[ô]If Me.Lista.Items(I) = [Ô]Guilherme[Ô] Then Index = I
If Lista.Items.Count = 1 Then
MsgBox([Ô]<= 1 [Ô] & Me.Lista.Items(0))
Exit Sub
End If
If Lista.Items.Count > 1 Then
For I As Integer = 2 To Lista.Items.Count
MsgBox([Ô]>= 1 [Ô] & Lista.Items.Item(I - 1))
Next
Exit Sub
End If
[ô]Next
[ô]If Index <> -1 Then Lista.Items.Remove(Lista.Items.Item(Index))
End Sub
End Class
Obrigado desde já pela a tua ajuda.
mas sempre haverá chance de se repetir, ai nesse caso so ficou emabaixo do outro porque o [Ô]Listbox[Ô] esta ordenando ele em ordem crescente numerica.
Daria ate para nao se repetir, a gente monta uma lista com os numeros Ex: 1 a 1000 e quando sortear o 500 tu adiciona ele em outra lista e ranca ele da primeira, mas se fizer variaos teste uma hora essa numeração acaba ne..
ve ai o que tu axa...
Daria ate para nao se repetir, a gente monta uma lista com os numeros Ex: 1 a 1000 e quando sortear o 500 tu adiciona ele em outra lista e ranca ele da primeira, mas se fizer variaos teste uma hora essa numeração acaba ne..
ve ai o que tu axa...
Tópico encerrado , respostas não são mais permitidas