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();
}
}
}
El metodo IsValid() lo podes reducir a una linea:
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.
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));
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:
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
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:
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.
y sin el 0 tamb xD porfavor.. esq creo q al combinarlos es q da el error :S
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:
Lista[i] = Rnd.Next(8);
por esta:
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.
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