elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


 


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo, raul338)
| | |-+  Palabras aleatorias SIN repeticion [ayuda]
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Palabras aleatorias SIN repeticion [ayuda]  (Leído 3,556 veces)
Psyke1
Wiki

Desconectado Desconectado

Mensajes: 1.086



Ver Perfil WWW
Palabras aleatorias SIN repeticion [ayuda]
« en: 15 Junio 2010, 02:12 »

Hola!! ;D a ver si me podeiss ayudar, la duda es:
Tengo esto para generar palabras aleatorias:
Pero quiero que esas palabras no se puedan repetir... y ya esta, asi de simple... :laugh:
(No os asusteis que esta en sucio  ;))
Código
  1. Private Sub Aleatory_Comb(ByRef CharList() As String, ByVal iDigits As Integer, ByVal iNumber As Long)
  2.    Dim sWord As String
  3.    Dim x     As Long
  4.    Dim y     As Long
  5.    For y = 1 To iNumber
  6.        For x = 1 To iDigits
  7.            Randomize
  8.            sWord = sWord + CharList((Rnd * (UBound(CharList()) - 1) + 1))
  9.        Next
  10.        MsgBox sWord: sWord = ""
  11.    Next
  12. End Sub
  13.  
  14. Private Sub Form_Load()
  15.    Dim Matriz() As String
  16.    Matriz = Split("a,b,c,d,e,f,g,h,i,j,k,l,,m,ñ,o,p,q,r,s,t,u,v,w,x,y,z", ",")
  17.    Call Aleatory_Comb(Matriz, 5, 7)
  18. End Sub

Gracias!!


« Última modificación: 15 Junio 2010, 02:23 por *PsYkE1* » En línea

TeKNo dUKe

Desconectado Desconectado

Mensajes: 91


^-^


Ver Perfil WWW
Re: Palabras aleatorias SIN repeticion [ayuda]
« Respuesta #1 en: 15 Junio 2010, 02:17 »

Porque no guardas en un array las palabras generadas y cada vez que generas una nueva si es repetida no la agregas ni la devuelves si es nueva la devuelves?.-


En línea


"Lucy is an artist. Lucy paints pictures of Barbara Streisand"
Psyke1
Wiki

Desconectado Desconectado

Mensajes: 1.086



Ver Perfil WWW
Re: Palabras aleatorias SIN repeticion [ayuda]
« Respuesta #2 en: 15 Junio 2010, 02:18 »

Pense eso ya, pero si genero 5000 palabras y cada una que genere tengo que buscarla en el array se demoraria mucho la cosa, no crees??  :silbar:

Salu2 y gracias!
En línea

TeKNo dUKe

Desconectado Desconectado

Mensajes: 91


^-^


Ver Perfil WWW
Re: Palabras aleatorias SIN repeticion [ayuda]
« Respuesta #3 en: 15 Junio 2010, 02:23 »

Es que es bien simple si no lo guardas no sabes si la palabra la generaste o no, en algún momento vas a tener que guardarlas y en algún momento compararlas. De todas formas no se en que pc estes programando pero no veo mejor eficiencia que tener un arraylist y preguntarle si ya tiene el elemento guardado.

Si quieres mas eficiencia haces tu el metodo de busqueda por ejemplo un algoritmo de busqueda binaria y cuando asignas siempre asignas de forma ordenada las palabras así mejoraras la eficiencia, de todas forma prueba lo que te sugiero no creo que tengas una demora de mas de 2ms en devolver si la palabra esta o no en el arraylist con 5k registros.-
En línea


"Lucy is an artist. Lucy paints pictures of Barbara Streisand"
.:BlackCoder:.


Desconectado Desconectado

Mensajes: 388


Cada dia C++!!


Ver Perfil
Re: Palabras aleatorias SIN repeticion [ayuda]
« Respuesta #4 en: 15 Junio 2010, 02:49 »

Hace tiempo hice lo mismo pero con numeros de n cifras... Y pes, yo no veo otra forma de no generar las mismas palabras que comparandolo con las otras palabras generadas... Al menos no uno mas eficiente... Si lo logras seria muy buen aporte  :xD

En línea

"No te esfuerzes por saber mas, esfuerzate por ser el mejor en lo que sabes... Y asi sabras mas" .:BlackCoder:. jajaja



TeKNo dUKe

Desconectado Desconectado

Mensajes: 91


^-^


Ver Perfil WWW
Re: Palabras aleatorias SIN repeticion [ayuda]
« Respuesta #5 en: 15 Junio 2010, 03:06 »

Si las palabras fueran todas las que puedes formar con X letras, o determinadas secuencias quizás se pudiera pensar en algún algoritmo con programación dinámica, o backtraking pero así palabras al azar de cualquier largo, sin guardarlas no veo como y de todas formas con pd o backtrak vas a necesitar guardar cosas.

Opino igual si encuentran una forma sin guardar seria un buen aporte, estare atento al tema :).-
En línea


"Lucy is an artist. Lucy paints pictures of Barbara Streisand"
BlackZeroX (Astaroth)
Wiki

Desconectado Desconectado

Mensajes: 3.182


I'Love...!¡.


Ver Perfil WWW
Re: Palabras aleatorias SIN repeticion [ayuda]
« Respuesta #6 en: 15 Junio 2010, 10:22 »

.
Yo uso este Modulo de Clase para esto Cls_StrCmb.cls, aqui les dejo un Ejemplo practico SIN FORM.

Estableces el proceso inicial en Sub Main OJO!¡.

Cls_StrCmb.cls
Código
  1. '
  2. '   /////////////////////////////////////////////////////////////
  3. '   // Autor:   BlackZeroX ( Ortega Avila Miguel Angel )       //
  4. '   //                                                         //
  5. '   // Web:     http://InfrAngeluX.Sytes.Net/                  //
  6. '   //                                                         //
  7. '   //    |-> Pueden Distribuir Este Codigo siempre y cuando   //
  8. '   // no se eliminen los creditos originales de este codigo   //
  9. '   // No importando que sea modificado/editado o engrandesido //
  10. '   // o achicado, si es en base a este codigo es requerido    //
  11. '   // el agradacimiento al autor.                             //
  12. '   /////////////////////////////////////////////////////////////
  13. '
  14. Rem Opciones.
  15. Option Explicit
  16.  
  17. Rem Eventos.
  18. Event StrOuput(ByRef Str_Text As String, ByRef Cancel As Boolean)
  19.  
  20. Rem Declaracion (Variables).
  21. Private Priv_String                             As String
  22.  
  23. Rem Propiedades.
  24. Public Property Get String_() As String
  25.    String_ = Priv_String
  26. End Property
  27. Public Property Let String_(Str_String As String)
  28.    Priv_String = Str_String
  29. End Property
  30.  
  31. Rem Procesos/funciones.
  32. Public Function Start_(Optional StrToProc As String) As Boolean
  33.    If Len(StrToProc) Then String_ = StrToProc
  34.    Call CombinateString(Priv_String)
  35. End Function
  36.  
  37.  
  38. Rem funciones/Procesos
  39. Private Sub CombinateString(ByRef Str_String As String, Optional ByRef str_Fix As String, Optional ByRef Cancel As Boolean)
  40. Dim Lng_LenStr                                  As Long
  41. Dim Lng_LenStrIndex                             As Long
  42.    If Cancel Then Exit Sub
  43.    Lng_LenStr = Strings.Len(Str_String)
  44.    If Lng_LenStr <> 1 Then
  45.        For Lng_LenStrIndex = 1 To Lng_LenStr
  46.            Call CombinateString(Strings.Left$(Str_String, Lng_LenStrIndex - 1) & Strings.Mid$(Str_String, Lng_LenStrIndex + 1), str_Fix & Strings.Mid$(Str_String, Lng_LenStrIndex, 1), Cancel)
  47.        Next
  48.    Else
  49.        RaiseEvent StrOuput(str_Fix & Str_String, Cancel)
  50.    End If
  51. End Sub
  52.  

Cls_Main.cls
Código
  1. '
  2. '   /////////////////////////////////////////////////////////////
  3. '   // Autor:   BlackZeroX ( Ortega Avila Miguel Angel )       //
  4. '   //                                                         //
  5. '   // Web:     http://InfrAngeluX.Sytes.Net/                  //
  6. '   //                                                         //
  7. '   //    |-> Pueden Distribuir Este Codigo siempre y cuando   //
  8. '   // no se eliminen los creditos originales de este codigo   //
  9. '   // No importando que sea modificado/editado o engrandesido //
  10. '   // o achicado, si es en base a este codigo es requerido    //
  11. '   // el agradacimiento al autor.                             //
  12. '   /////////////////////////////////////////////////////////////
  13. '
  14. Rem Opciones.
  15. Option Explicit
  16.  
  17. Rem Eventos.
  18. Public WithEvents ClsStrCmb                    As Cls_StrCmb
  19.  
  20. Rem Declaraciones.
  21. Private CantCombinateString                    As Long
  22.  
  23. Rem procesos/Funciones
  24. Private Sub ClsStrCmb_StrOuput(ByRef Str_Text As String, ByRef Cancel As Boolean)
  25.    CantCombinateString = CantCombinateString + 1
  26.    Debug.Print Str_Text
  27.    DoEvents
  28. End Sub
  29. Public Property Get MaxConbinaciones() As Long
  30.    MaxConbinaciones = CantCombinateString
  31. End Property
  32. Private Sub Class_Initialize()
  33.    Set ClsStrCmb = New Cls_StrCmb
  34. End Sub
  35. Private Sub Class_Terminate()
  36.    Set ClsStrCmb = Nothing
  37. End Sub
  38.  

Mod_Main.bas
Código
  1. '
  2. '   /////////////////////////////////////////////////////////////
  3. '   // Autor:   BlackZeroX ( Ortega Avila Miguel Angel )       //
  4. '   //                                                         //
  5. '   // Web:     http://InfrAngeluX.Sytes.Net/                  //
  6. '   //                                                         //
  7. '   //    |-> Pueden Distribuir Este Codigo siempre y cuando   //
  8. '   // no se eliminen los creditos originales de este codigo   //
  9. '   // No importando que sea modificado/editado o engrandesido //
  10. '   // o achicado, si es en base a este codigo es requerido    //
  11. '   // el agradacimiento al autor.                             //
  12. '   /////////////////////////////////////////////////////////////
  13. '
  14. Rem Opciones.
  15. Option Explicit
  16.  
  17. Rem Procesos/funciones
  18. Sub MAIN()
  19. Dim Cls_NewMainProc                             As New Cls_Main
  20. Const Const_StrtoProc                           As String = "BlackZeroX"
  21.    With Cls_NewMainProc
  22.        With .ClsStrCmb
  23.            '   //  .String_ = Const_StrtoProc
  24.            Call .Start_(Const_StrtoProc)
  25.        End With
  26.        Debug.Print "Max Combinaciones {"; .ClsStrCmb.String_; "} son de"; .MaxConbinaciones
  27.    End With
  28. End Sub
  29.  

Dulce Infierno Lunar!¡.
« Última modificación: 15 Junio 2010, 10:28 por BlackZeroX▓▓▒▒░░ » En línea




CScript (Actualizado 26/06/2013).

FileX <-- Re-modelando...
Web Principal-->[ Blog(VB6/C/C++) | Host File | Scan Port) ]

The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilit y el metal mi relig
Psyke1
Wiki

Desconectado Desconectado

Mensajes: 1.086



Ver Perfil WWW
Re: Palabras aleatorias SIN repeticion [ayuda]
« Respuesta #7 en: 15 Junio 2010, 10:30 »

Código
  1. '
  2. '   /////////////////////////////////////////////////////////////
  3. '   // Autor:   BlackZeroX ( Ortega Avila Miguel Angel )       //
  4. '   //                                                         //
  5. '   // Web:     http://InfrAngeluX.Sytes.Net/                  //
  6. '   //                                                         //
  7. '   //    |-> Pueden Distribuir Este Codigo siempre y cuando   //
  8. '   // no se eliminen los creditos originales de este codigo   //
  9. '   // No importando que sea modificado/editado o engrandesido //
  10. '   // o achicado, si es en base a este codigo es requerido    //
  11. '   // el agradacimiento al autor.                             //
  12. '   /////////////////////////////////////////////////////////////
  13. '
  14. Rem Opciones.
  15. Option Explicit
  16.  
  17. Rem Procesos/funciones
  18. Sub MAIN()
  19. Dim Cls_NewMainProc                             As New Cls_Main
  20. Const Const_StrtoProc                           As String = "BlackZeroX"
  21.    With Cls_NewMainProc
  22.        With .ClsStrCmb
  23.            '   //  .String_ = Const_StrtoProc
  24.            Call .Start_(Const_StrtoProc)
  25.        End With
  26.        Debug.Print "Max Combinaciones {"; .ClsStrCmb.String_; "} son de"; .MaxConbinaciones
  27.    End With
  28. End Sub
Pero si no me equivoco esto unicamente te muestra la cantidad de combinaciones posibles, ¿no?  :huh:

Gracias y Salu2! ;)
En línea

BlackZeroX (Astaroth)
Wiki

Desconectado Desconectado

Mensajes: 3.182


I'Love...!¡.


Ver Perfil WWW
Re: Palabras aleatorias SIN repeticion [ayuda]
« Respuesta #8 en: 15 Junio 2010, 10:34 »

No, te muestra en el debuger las combinaciones posibles de el texto insertado, pero mejor LEE BIEN EL CODIGO FUENTE COMPLETO!¡,

El procesador real esta en Cls_StrCmb y este salta un evento en cada combinación el cual es accinado en Cls_Main el cual es el contener de los evento y el objecto Cls_StrCmb del cual todo empiesa en Mod_Main

Pero mejor correlo y abre el Debuger o Inmediato del IDE de VB6  ( Control + G )

Dulce Infierno Lunar!¡.
« Última modificación: 15 Junio 2010, 10:38 por BlackZeroX▓▓▒▒░░ » En línea




CScript (Actualizado 26/06/2013).

FileX <-- Re-modelando...
Web Principal-->[ Blog(VB6/C/C++) | Host File | Scan Port) ]

The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilit y el metal mi relig
Psyke1
Wiki

Desconectado Desconectado

Mensajes: 1.086



Ver Perfil WWW
Re: Palabras aleatorias SIN repeticion [ayuda]
« Respuesta #9 en: 15 Junio 2010, 10:37 »

Ok Gracias... ;D
En línea

BlackZeroX (Astaroth)
Wiki

Desconectado Desconectado

Mensajes: 3.182


I'Love...!¡.


Ver Perfil WWW
Re: Palabras aleatorias SIN repeticion [ayuda]
« Respuesta #10 en: 15 Junio 2010, 10:39 »


Código
  1. Private Sub ClsStrCmb_StrOuput(ByRef Str_Text As String, ByRef Cancel As Boolean)
  2.    CantCombinateString = CantCombinateString + 1
  3.    Debug.Print Str_Text
  4.    DoEvents
  5. End Sub
  6.  

Dulce Infierno Lunar!¡.
En línea




CScript (Actualizado 26/06/2013).

FileX <-- Re-modelando...
Web Principal-->[ Blog(VB6/C/C++) | Host File | Scan Port) ]

The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilit y el metal mi relig
Psyke1
Wiki

Desconectado Desconectado

Mensajes: 1.086



Ver Perfil WWW
Re: Palabras aleatorias SIN repeticion [ayuda]
« Respuesta #11 en: 15 Junio 2010, 23:55 »

Concretamente para lo que queria hacer se me ocurrio esto:
Código
  1. Option Explicit
  2. Private Sub Aleatory_Comb(ByRef CharList() As String, ByVal iDigits As Integer, ByVal iNumber As Long)
  3.    Dim sWord                       As String
  4.    Dim lTotalChar                  As Long
  5.    Dim x                           As Long
  6.    Dim y                           As Long
  7.    Dim Col                         As Collection
  8.    Set Col = New Collection
  9.    lTotalChar = UBound(CharList())
  10.    If iNumber > (lTotalChar) ^ iDigits Then Exit Sub
  11.    On Error Resume Next
  12.    Do While y < iNumber
  13.        For x = 1 To iDigits
  14.            Randomize
  15.            sWord = sWord + CharList((Rnd * (lTotalChar - 1)) + 1)
  16.        Next
  17.        Col.Add sWord, sWord
  18.        If Err.Number = 0 Then
  19.            Debug.Print sWord
  20.            y = y + 1
  21.        Else
  22.            Debug.Print "Palabra duplicada : "; sWord 'Esta linea es solo para que veais que la detecta
  23.            Err.Clear
  24.        End If
  25.        sWord = vbNullString
  26.    Loop
  27.    Set Col = Nothing
  28. End Sub
  29.  
  30. Private Sub Form_Load()
  31.    Dim Matriz() As String
  32.    Matriz = Split("a,b,c", ",") ' Solo pongo 3 letras para que se repitan =)
  33.    Call Aleatory_Comb(Matriz, 5, 7)
  34. End Sub
Funcionar funciona... ;)

Salu2! :)
« Última modificación: 16 Junio 2010, 12:54 por *PsYkE1* » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Palabras resevadas de pascal
Programación General
xero_cool 3 4,701 Último mensaje 22 Febrero 2009, 14:55
por Glezo
Nesecito ayuda con un mmorpg y sus recompensas aleatorias
Hacking Básico
Josh090 3 1,946 Último mensaje 11 Abril 2013, 01:06
por Ryuk22
Powered by SMF 1.1.19 | SMF © 2006-2008, Simple Machines