Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 1
 
 
Obtener Números Aleatorios Del Tipo Real
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje Obtener Números Aleatorios Del Tipo Real 
 
Hola!.

Quería obtener una cantidad de números aleatorios que fueran reales y sin repetición.
Lo hice de dos formas con cadenas y con reales. Con reales no me ha salido como quisiera,
se repiten..no son iguales.

Private Const CANTNUMS As Integer = 10

Public Sub Main()
  
  Randomize
  
  ConCadenas()
  ConReales()
  
End

Public Sub ConCadenas()
  
  Dim anumeros As New String[]
  Dim snumero As String
  Dim x As Integer
    
  While x < CANTNUMS    
    snumero = Format(Rnd(0.01, 0.02), "0.###")
    snumero = Replace(snumero, ",", ".")    
    If anumeros.Find(snumero) = -1 Then
      anumeros.Add(snumero)
      x += 1
    Endif
  Wend
  
  MostrarArray(anumeros)
  
End

Public Sub ConReales()
  
  Dim anumeros As New Float[]
  Dim snumero As String
  Dim fnumero As Float
  Dim x As Integer
  
  
  While x < CANTNUMS    
    snumero = Format(Rnd(0.01, 0.02), "0.###")
    snumero = Replace(snumero, ",", ".")    
    fnumero = CFloat(snumero)    
    If anumeros.Find(fnumero) = -1 Then
      anumeros.Add(fnumero)
      x += 1
    Endif
  Wend
  
  MostrarArray(anumeros)
  
End

Public Sub MostrarArray(auniversal As Variant[])

  Dim elemento As Variant
  Dim tipo As String
  Dim cuenta As Integer
  
  Select Case TypeOf(auniversal[0])
    Case gb.String
      tipo = "cadena"
    Case gb.Float
      tipo = "real"
  End Select
  
  Print "El tipo es: " & tipo
  For Each elemento In auniversal
   If Not (cuenta = auniversal.Max) Then
      Print elemento; " , ";        
    Else
      Print elemento
    Endif
    cuenta += 1
  Next
  Print    
  
End
 


La salida fue:
Citar:

El tipo es: cadena
0.01 , 0.019 , 0.016 , 0.018 , 0.017 , 0.014 , 0.015 , 0.012 , 0.02 , 0.011

El tipo es: real
0,016 , 0,02 , 0,017 , 0,015 , 0,012 , 0,019 , 0,011 , 0,01 , 0,011 , 0,012


Como veis se repiten los números reales. El ejemplo necesita otro planteamiento, se ha repetido parte del código.
La idea es que se vean los tipos.

Saludos
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Obtener Números Aleatorios Del Tipo Real 
 
Usando reales en vez de cadenas puede crear el problema que si quiero tres decimales, el ultimo decimal pueda
ser un cero y se desprecie, quedando un número de dos decimales en vez de tres.

Por lo que he decidido usar cadenas.

' gambas module file

Private Const NFILAS As Integer = 10
Private Const NCOLUMNAS As Integer = 5
Private Const MINIMO As Float = 0.01
Private Const MAXIMO As Float = 0.10
Private Const ESPACIOS As Integer = 5

Public Sub Main()
  
  Randomize
  
  ConCadenas()
  
End

Public Sub ConCadenas()
  
  Dim anumcadenas As New String[]
  Dim listatotal As New String[][]
  Dim snumero As String  
  Dim x, i As Integer
  
  For i = 1 To NCOLUMNAS
    x = 1
    While x <= NFILAS    
      'Formateo el número decimal generado, siempre con un cero por la derecha por si se desprecia
      snumero = Format(Rnd(MINIMO, MAXIMO), "0.##0")    
      snumero = Replace(snumero, ",", ".")    
      'Se comprueba si no existe en el array y se añade en ese caso
      If anumcadenas.Find(snumero) = -1 Then
        anumcadenas.Add(snumero)
        x += 1
      Endif
    Wend
    'Ordeno el array de los números
    anumcadenas.Sort()
    'Añado una copia del array al array de array
    listatotal.Add(anumcadenas.Copy())
    'Elimino todos los elementos el array
    anumcadenas.Clear    
  Next  
  MostrarArray(listatotal)
  
End

Public Sub MostrarArray(anumcadenas As String[][])
  
  Dim fila, columna As Integer
  
  For fila = 0 To NFILAS - 1
    For columna = 0 To NCOLUMNAS - 1
      ' He usado Strings$ para crear n espacios entre las distintas columnas
      Print anumcadenas[columna][fila] & String$(ESPACIOS, " ");
    Next
    Print        
  Next
  
End
 


Salida:

Citar:

0.018     0.039     0.011     0.014     0.025    
0.033     0.049     0.027     0.023     0.043    
0.036     0.050     0.030     0.027     0.044    
0.051     0.065     0.031     0.035     0.050    
0.070     0.068     0.043     0.037     0.059    
0.071     0.071     0.048     0.047     0.065    
0.078     0.074     0.054     0.051     0.071    
0.079     0.075     0.079     0.067     0.084    
0.083     0.077     0.094     0.088     0.095    
0.086     0.078     0.096     0.091     0.098


No sé si se apreciara los espacios en la cita. Lo veré al enviar el mensaje.

Saludos
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 
OcultarTemas parecidos
Tema Autor Foro Respuestas último mensaje
No hay nuevos mensajes Números Aleatorios (Solucionado) Cubel General 3 Jueves, 18 Febrero 2010, 17:10 Ver último mensaje
4octavio4
No hay nuevos mensajes Obtener Como String Desde Una Operación U... vuott Aplicaciones/Fragmentos de Código 0 Domingo, 19 Julio 2015, 00:31 Ver último mensaje
vuott
No hay nuevos mensajes Guardar Una Pequeña Información Tipo Cla... gambafeliz General 8 Martes, 10 Septiembre 2019, 11:06 Ver último mensaje
gambafeliz
No hay nuevos mensajes Convertir Números A Números Romanos (1 A... v3ctor Aplicaciones/Fragmentos de Código 11 Domingo, 05 Abril 2020, 18:40 Ver último mensaje
v3ctor
 

Publicar nuevo tema  Responder al tema  Página 1 de 1
 

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado
Usuarios registrados conectados: Ninguno


 
Lista de permisos
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
Puede descargar archivos
No puede publicar eventos en el calendario



  

 

cron