PROBLEMA NO GERADOR DE Nº ALEATORIOS SEM REPETICAO

PROGRAMADORVB6 29/11/2010 15:17:57
#358406





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
PEGUDO 30/11/2010 14:40:44
#358507
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.
PROGRAMADORVB6 30/11/2010 19:29:04
#358525
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.
PROGRAMADORVB6 01/12/2010 10:42:43
#358542
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
RODRIGOFERRO 01/12/2010 13:51:22
#358555
Resposta escolhida
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
PROGRAMADORVB6 01/12/2010 16:54:23
#358582
Obrigado.
RODRIGOFERRO 02/12/2010 10:57:43
#358620
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
PROGRAMADORVB6 02/12/2010 12:50:44
#358632
h2so4-programadorvb6@hotmail.com
RODRIGOFERRO 03/12/2010 10:01:14
#358702
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()[Ô]

PROGRAMADORVB6 03/12/2010 10:35:01
#358706
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!

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.
RODRIGOFERRO 03/12/2010 13:53:32
#358729
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...
Página 1 de 2 [12 registro(s)]
Tópico encerrado , respostas não são mais permitidas