Foros del Web » Programación para mayores de 30 ;) » .NET »

Comportamiento extraño en números aleatorios

Estas en el tema de Comportamiento extraño en números aleatorios en el foro de .NET en Foros del Web. Hola. Cree una clase para que me devuelva diferentes permutaciones de una cadena de longitud fija y que siempre es "123456789". Este es el código: ...
  #1 (permalink)  
Antiguo 23/09/2009, 10:59
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.418
Antigüedad: 19 años, 2 meses
Puntos: 9
Comportamiento extraño en números aleatorios

Hola. Cree una clase para que me devuelva diferentes permutaciones de una cadena de longitud fija y que siempre es "123456789".
Este es el código:

Código C#:
Ver original
  1. public class SetPermutation
  2.     {
  3.  
  4.         private const string SET = "123456789";
  5.         private bool[,] used;
  6.         private Random randomizer;
  7.  
  8.         public SetPermutation()
  9.         {                    
  10.             randomizer = new Random();
  11.         }
  12.  
  13.         public string Next()
  14.         {
  15.             int num;
  16.             bool valid;
  17.             string p = "";
  18.             string possiblevalues = SET;
  19.  
  20.             CreateUsedArray();  
  21.             for (int i = 0; i < SET.Length; i++)
  22.             {
  23.                 valid = false;
  24.                 do
  25.                 {
  26.                     num = int.Parse(possiblevalues[randomizer.Next(0, possiblevalues.Length - 1)].ToString());
  27.                     if (!used[num - 1, i])
  28.                     {
  29.                         p += num.ToString();
  30.                         possiblevalues = possiblevalues.Remove(possiblevalues.IndexOf(num.ToString()), 1);
  31.                         used[num - 1, i] = true;
  32.                         valid = true;
  33.                     }                    
  34.                 } while (!valid);
  35.             }
  36.  
  37.             return p;
  38.         }
  39.  
  40.         private void CreateUsedArray()
  41.         {
  42.             used = new bool[Match.GRIDSIZE, Match.GRIDSIZE];
  43.  
  44.             for (int i = 0; i < Match.GRIDSIZE; i++)
  45.             {
  46.                 for (int j = 0; j < Match.GRIDSIZE; j++)
  47.                 {
  48.                     used[i, j] = false;
  49.                 }
  50.             }
  51.         }
  52.  
  53.     }

El algoritmo que uso es muy simple. Por cada posicion que debo llenar en la cadena p, busco un número que no haya sido usado en esa posición y tampoco en el resto de la cadena. La variable possiblevalues es la que utilizo para esto.
Mi problema está en esta línea:

num = int.Parse(possiblevalues[randomizer.Next(0, possiblevalues.Length - 1)].ToString());

En esta línea obtengo una posición aleatoria para extraer el caracter de possiblevalues en esta posición. El problema es que primero me elige de manera aleatoria las primeras 8 posiciones y siempre queda para el final la última. Para que lo vean con un ejemplo:

possiblevalues se inicia siempre con "123456789" las permutaciones que me devuelve pueden ser 428753619, 847562319, xxxxxxxx9.
Pero si inicio possiblevalues con "123456798" las permutaciones que me devuelve pueden ser como 195347628, 245769138, xxxxxxxx8.
Siempre me deja el último caracter para el final.
No sé si este es un error en el algoritmo o bien es de algún comportamiento de la función del objeto Random.
Voy a agradecer cualquier tipo de sugerencia que puedan darme.
Saludos.
__________________
Add, never Remove

Última edición por mariano_donati; 23/09/2009 a las 11:08 Razón: Me confundí en las etiquetas para resaltar código
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:50.