Ayuda con numeros random en arrays

Iniciado por Edu, 6 Diciembre 2010, 19:01 PM

0 Miembros y 1 Visitante están viendo este tema.

Edu

Espero que entiendan el codigo, es decir.. lo q quiero hacer, y si me lo pueden corregir, y si tienen q cambiar muchas cosas para q quede mejor no importa pero lo q quiero es generar un numero al azar desde 0 hasta 7 y ponerlo en el array[0] solo si es distinto a 0 y si no se repite con los otros indices del array, parece simple pero me ha costado y ya pregunte una vez aca pero no entendi bien y ahora quiero ver si solo pueden corregirme los errores porfavor



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace juego_de_cartas
{
   class Program
   {
       Random rnd = new Random(unchecked((int)DateTime.Now.Ticks));
      public int[] pozo1 = new int[7];
       public int valor = 0;
      public int ant = 0;
       
       static void Main(string[] args)
       {
           

           Repartir();
         
       }

       public static bool IsValid(int bvalor, int bant)
       
       
               {
                   if (bvalor == 0)
                   {

                       return false;
                   }
                   else
                   {
                       if (bvalor == bant)
                       {
                           return false;
                       }
                       else
                       {
                           return true;
                       }
                   }
               }

       public static void Repartir()
       
       {

           for (int i = 0; i < pozo1.Length; i++)
           {
           first:
               valor = (int)(rnd.NextDouble() * 8D);
               ant = valor;

               if (IsValid(valor, ant))
               {
                   pozo1[i] = valor;
                   Console.WriteLine("Array de indice {0}, valor: {1}", i, pozo1[i]);
               }
               else { goto first; }
           }




           Console.ReadKey();

       }


   }

}


Siuto

#1
El metodo IsValid() lo podes reducir a una linea:

Código (csharp) [Seleccionar]
return bvalor != 0 && bvalor != bant


No lo corri, solo lo pense en el aire, pero no uses etiquetas con GOTO, no es una forma feliz de programar.

Código (csharp) [Seleccionar]

public static void Repartir()
{
for (int i = 0; i < this.pozo1.Length; i++)
{
this.pozo1[i] = this.GetValidValue(i);
Console.WriteLine("Array de indice {0}, valor: {1}", i, pozo1[i]);
}

Console.ReadKey();
}

public int GetValidValue(int i)
{
int ant;

if (i == 0) ant = 0;
else ant = this.pozo1[i-1];

// no me acuerdo si es valido esta asignacion dejo una alternativa abajo
while (!IsValid(valor = (int)(this.rnd.NextDouble() * 8D), ant));

return valor;
}


// alternativa
do
{
valor = (int)(this.rnd.NextDouble() * 8D);
} while (!IsValid(valor, ant));

Edu

#2

return bvalor != 0 && bvalor != bant


Crees que no lo intente? xD

Quiero ver otras soluciones porfavor y q funcione como quiero q funcione please esque usando la logica es facil pero da error en muchas cosas cuando quiero hacerlo :S

edit: Lo arregle para q quede mejor con lo q comento Siuto y quedo asi:

Código (csharp) [Seleccionar]


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace juego_de_cartas
{
   class Program
   {
       static Random rnd = new Random(unchecked((int)DateTime.Now.Ticks));
      public static int[] pozo1 = new int[7];
       public static int valor = 0;
      public int ant = 0;
       
       static void Main(string[] args)
       {
           

           Repartir();
         
       }

       public static bool IsValid(int bvalor, int bant)
       
               {
                   return ((bvalor != 0) && (bvalor != bant));
               }


       public static void Repartir()
       
       {

           for (int i = 0; i < pozo1.Length; i++)
           {
               pozo1[i] = GetValidValue(i);
               Console.WriteLine("Array de indice {0}, valor: {1}", i, pozo1[i]);
           }

           Console.ReadKey();

       }


       public static int GetValidValue(int i)
       
       {
           int ant;

           if (i == 0) ant = 0;
           else ant = pozo1[i-1];

               // no me acuerdo si es valido esta asignacion dejo una alternativa abajo
           while (!IsValid(valor = (int)(rnd.NextDouble() * 8D), ant));

           return valor;
            }



   }

}



Pero sigue sin andar, exactamente hace lo mismo q hacia yo es decir, el 0 no aparece mas pero lo de if bvalor != bant es como si no le hace caso xD

Khronos14

#3
Por lo que entendí tienes un array de tamaño 7 y quieres almacenar en ese array números desde el 0 al 7, sin que se repitan. El algoritmo creo que es bastante sencillo. Prueba a hacer algo como esto:

Código (csharp) [Seleccionar]

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
   class Program
   {
       private static int[] Lista = new int[7];

       public static bool NumExists(int Num, int MaxPos)
       {
           bool resultado = false;
               for (int i = 0; i < MaxPos; i++)
                   if (Lista[i] == Num)
                   {
                       resultado = true;
                       break;
                   }
           return resultado;
       }

       public static void RandomNumbers()
       {
           Random Rnd = new Random(unchecked((int)DateTime.Now.Ticks));
           for (int i = 0; i < Lista.Length; i++)
               do{
                   Lista[i] = Rnd.Next(8);
               }while(NumExists(Lista[i], i) == true);
           Rnd = null;
       }

       static void Main(string[] args)
       {
           RandomNumbers();
           for (int i = 0; i < Lista.Length; i++)
               Console.WriteLine("Número: {0}", Lista[i]);
           Console.ReadLine();
       }
   }
}



La salida de la consola sería algo como esto:


Número: 7
Número: 5
Número: 0
Número: 1
Número: 6
Número: 4
Número: 2


Saludos.

Edu

y sin el 0 tamb xD porfavor.. esq creo q al combinarlos es q da el error :S

Khronos14

Cita de: XXX-ZERO-XXX en  6 Diciembre 2010, 22:58 PM
y sin el 0 tamb xD porfavor.. esq creo q al combinarlos es q da el error :S

Es tan simple que con cambiar está línea ya lo haces:

Código (csharp) [Seleccionar]

Lista[i] = Rnd.Next(8);


por esta:

Código (csharp) [Seleccionar]

Lista[i] = Rnd.Next(1, 8);


Y como la lista tiene tamaño 7 y le pides valores entre 1 y 7, siempre te va a mostrar desde 1 hasta 7 pero con los números desordenados.

Saludos.

Edu

Muchisimas gracias la verdad, ahora sigo solo ya q tengo q hacer eso pero con 2 arrays mas xD pero el 2do empieza por 8 hasta 15 y el 3ero de 15 a 21