Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

numeros aleatorios no repetidos

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: numeros aleatorios no repetidos Responder citando

¿ Existe alguna función que me dé un cierto numero de valores enteros aleatorios no repetidos dentro de un rango de numeros ?

EJEMPLO:

De entre los valores 1 y 50, dame 5 Números aleatorios y no repetidos.
POSIBLES RESULTADOS:
{1,8,9,15,18,32}
{12,15,19,25,28}
{25,28,32,33,49}
{...}...

Es para hacerme un programita que me dé los numeros del EUROMILLON.
_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: Responder citando

yo no se si exista una función para ello, pero yo lo haría así:

Código:

#include <iostream>
using namespace std;

void Aleatorios(int Rango_Min,int Rango_Max,int Cantidad,int Valores[])
{
     int Rango = abs( Rango_Max-Rango_Min ) ;
     int *Numeros = new int [Rango] ;

     // Inicializa el arrreglo creado
     for( int i=0; i<Rango ; ++i )
          Numeros[i] = Rango_Min + i ;

     // Se revuelven el arreglo Numeros
     for( int i=0 ; i<Rango ; ++i ){
          int indice = random( Rango );
          int aux = Numeros[i] ;
          Numeros[i] = Numeros[indice] ;
          Numeros[indice] = aux ;
     }

     // Se copia la Cantidad deseada
     for( int i=0 ; i<Cantidad && i<Rango ; ++i )
          Valores[i] = Numeros[i] ;

     delete [] Numeros ;
}


en la función main o en algún evento (por ejemplo OnCreate), se debe inicializar la semilla para la función random

Código:

randomize();


y para utilizar la función

Código:

int Numeros[5];
Aleatorios(0,50,5,Numeros);


yo la probe varias veces y me arrojo:

Numeros={19,38,6,21,46}
Numeros={32,9,28,35,17}

lo cual muestra que funciona bien.
Saludos
_________________
Jaime Alberto López R.
www.geocities.com/jaimealopezr
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: Responder citando

Con la función que me das, se repiten numeros.

De esta forma funciona perfectamente:
Codigo Archivo.h:
Código:

//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:   // IDE-managed Components
   TPanel *Panel1;
   TEdit *Edit1;
   TEdit *Edit2;
   TEdit *Edit3;
   TEdit *Edit4;
   TEdit *Edit5;
   TLabel *Label1;
   TLabel *Label2;
   TEdit *Edit6;
   TEdit *Edit7;
   TEdit *Edit8;
   TEdit *Edit9;
   TEdit *Edit10;
   TLabel *Label3;
   TLabel *Label4;
   TEdit *Edit11;
   TEdit *Edit12;
   TEdit *Edit13;
   TEdit *Edit14;
   TEdit *Edit15;
   TLabel *Label5;
   TLabel *Label6;
   TEdit *Edit16;
   TEdit *Edit17;
   TEdit *Edit18;
   TEdit *Edit19;
   TEdit *Edit20;
   TLabel *Label7;
   TLabel *Label8;
   TEdit *Edit21;
   TEdit *Edit22;
   TEdit *Edit23;
   TEdit *Edit24;
   TEdit *Edit25;
   TLabel *Label9;
   TLabel *Label10;
   TLabel *Label11;
   TLabel *Label12;
   TLabel *Label25;
   TEdit *Edit26;
   TEdit *Edit27;
   TEdit *Edit28;
   TEdit *Edit29;
   TEdit *Edit30;
   TButton *Button1;
   TEdit *Edit31;
   TEdit *Edit32;
   TEdit *Edit33;
   TEdit *Edit34;
   TEdit *Edit35;
   TEdit *Edit36;
   TEdit *Edit37;
   TEdit *Edit38;
   TEdit *Edit39;
   TEdit *Edit40;
   TEdit *Edit41;
   TEdit *Edit42;
   void __fastcall Button1Click(TObject *Sender);
private:   // User declarations
public:      // User declarations
   __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
   void __fastcall EuroMillon(int Numeros[]);
   void Intercambio(int &x, int &y);
//---------------------------------------------------------------------------
#endif


Código Archivo.cpp:
Código:

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include <Math.hpp>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
   : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   Randomize();
   int Apuestas[7]={0,0,0,0,0,0,0};
   int Componente = Edit1->ComponentIndex;
   int Casilla = 0;
   int Estrella = Edit31->ComponentIndex;

   for(int Suma = 0;Suma < 6; Suma++)
   {
      EuroMillon(Apuestas);

      if(Suma > 0)
      {
          Componente = Componente + 5;
          Estrella = Estrella +2;
      }

      for(Casilla = 0; Casilla < 5;Casilla++)
      {
         ((TEdit*)Components[Componente+Casilla])->Text = String(Apuestas[Casilla]);
      }

      for(Casilla = 0; Casilla < 2;Casilla++)
      {
         ((TEdit*)Components[Estrella +Casilla])->Text = String(Apuestas[Casilla+5]);
      }
   }

}
//---------------------------------------------------------------------------
void __fastcall EuroMillon(int Numeros[])
{
   int Numero = 0; //Numero elegido
   int cont_Apuesta = 0;//Apuesta que juega de 0 a 4
   int Orden[7] = {0,0,0,0,0,0,0};// Para ordenar Numeros que juegan

   // Primeros 5 Enteros de la Apuesta
   for(cont_Apuesta; cont_Apuesta < 5;cont_Apuesta++)
   {
      Numero = RandomRange(1,51);

      if(Numero == Numeros[0])
         cont_Apuesta--;
      else
            Numeros[0] = Numero;

      Numero = RandomRange(1,51);

      if(Numero == Numeros[0] || Numero == Numeros[1])
         cont_Apuesta--;
      else
            Numeros[1] = Numero;

      Numero = RandomRange(1,51);

      if(Numero == Numeros[0] || Numero == Numeros[1] || Numero == Numeros[2])
         cont_Apuesta--;
      else
            Numeros[2] = Numero;

      Numero = RandomRange(1,51);

      if(Numero == Numeros[0] || Numero == Numeros[1] || Numero == Numeros[2] || Numero == Numeros[3])
         cont_Apuesta--;
      else
            Numeros[3] = Numero;

      Numero = RandomRange(1,51);

      if(Numero == Numeros[0] || Numero == Numeros[1] || Numero == Numeros[2] || Numero == Numeros[3] || Numero == Numeros[4])
         cont_Apuesta--;
      else
            Numeros[4] = Numero;
   }

   // Ultimos dos Enteros de la Apuesta
   for(cont_Apuesta = 0; cont_Apuesta < 2;cont_Apuesta++)
   {
      Numero = RandomRange(1,10);

      if(Numero == Numeros[5])
         cont_Apuesta--;
      else
            Numeros[5] = Numero;

      Numero = RandomRange(1,10);

      if(Numero == Numeros[5] || Numero == Numeros[6])
         cont_Apuesta--;
      else
            Numeros[6] = Numero;
   }


   // Ordenar Array de los primeros 5 Enteros
   int i, j;
   for(i = 0; i < 4; i++)
      for(j = i+1; j<5; j++)
         if(Numeros[i] > Numeros[j])
            Intercambio(Numeros[i], Numeros[j]);

// Ordenar Array de los Ultimos 2 Enteros
   for(i = 5; i < 6; i++)
      for(j = i+1; j<7; j++)
         if(Numeros[i] > Numeros[j])
            Intercambio(Numeros[i], Numeros[j]);
}
// Intercambia el contenido de 'X' en 'Y' y de 'Y' en 'X'
void Intercambio(int &x, int &y)
{
   int aux = x;
   x = y;
   y = aux;
}



Gracias por tu aportación.
_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: Responder citando

Cuando dices que se repiten números te refieres a que se repite alguno de los cinco números del arreglo generado o que se repiten en cojunto algunas de las combinaciones?

Yo probé el siguiente código:
Código:

#include <conio>
#include <iostream>
using namespace std;

void Aleatorios(int Rango_Min,int Rango_Max,int Cantidad,int Valores[])
{
     int Rango = abs( Rango_Max-Rango_Min ) ;
     int *Numeros = new int [Rango] ;

     // Inicializa el arrreglo creado
     for( int i=0; i<Rango ; ++i )
          Numeros[i] = Rango_Min + i ;

     // Se revuelven el arreglo Numeros
     for( int i=0 ; i<Rango ; ++i ){
          int indice = random( Rango );
          int aux = Numeros[i] ;
          Numeros[i] = Numeros[indice] ;
          Numeros[indice] = aux ;
     }

     // Se copia la Cantidad deseada
     for( int i=0 ; i<Cantidad && i<Rango ; ++i )
          Valores[i] = Numeros[i] ;

     delete [] Numeros ;
}

void main()
{
     // Semilla para los valores aleatorios
     randomize();

     int Numeros[7];

     for( int k=0 ; k<50 ; k++ ){
          Aleatorios(0,50,7,Numeros);

          for( int i=0 ; i<7 ; i++ )
               cout << Numeros[i] << " " ;
          cout << '\n' ;
     }
     getch();
}


y genera 50 combinaciones de números.
Míralo y me cuentas. Lo único que faltaría es ordenarlos.
Saludos.
_________________
Jaime Alberto López R.
www.geocities.com/jaimealopezr
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: Responder citando

correcto, funciona.
_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.