2009-09-29 24 views
20

¿Estoy mirando demasiado lejos para ver algo tan simple como elegir un número: 0 o 1?Número aleatorio: 0 o 1

 Random rand = new Random(); 

     if (rand.NextDouble() == 0) 
     { 
      lnkEvents.CssClass = "selected"; 
     } 
     else 
     { 
      lnkNews.CssClass = "selected"; 
     } 
+5

Todas las soluciones siguientes, ¿ha creado un nuevo objeto Aleatorio? Eso está bien a menos que crees muchos de ellos muy rápidamente. Si lo haces, es muy probable que todos tengan la misma semilla aleatoria, y obtendrás el mismo resultado una y otra vez. Para evitar el problema, crea un Aleatorio en algún lugar de tu programa y pásalo. –

+0

NextDouble no existe en la clase aleatoria –

Respuesta

71
Random rand = new Random(); 

if (rand.Next(0, 2) == 0) 
    lnkEvents.CssClass = "selected"; 
else 
    lnkNews.CssClass = "selected"; 

Random.Next recoge un entero aleatorio entre el límite inferior (inclusive) y el límite superior (exclusivo).

+0

Este es el que yo buscaría. – RichardOD

+8

Nota: rand aleatorio = nuevo Random(); debería, idealmente, estar atascado en otro lugar, no justo encima de la llamada a Rand. Siguiente. Idealmente, debe inicializarse una vez. – Brian

26

Si desea 50/50 probabilidad, sugiero:

Random rand = new Random(); 

if (rand.NextDouble() >= 0.5) 
    lnkEvents.CssClass = "selected"; 
else 
    lnkNews.CssClass = "selected"; 
+0

Yeap: en la actualidad, la probabilidad no está cerca de eso. :-). – RichardOD

+2

¿Podría el infractor por favor dejar un comentario. Gracias. –

2

Random.NextDouble() seleccionará cualquier número doble de 0 pero menor que 1,0. La mayoría de estos números no son cero, por lo que su distribución no será tan uniforme como esperaba.

+6

"no ser tan parejo como esperaba" es la subestimación del año. Prácticamente todos los resultados generados serían 1. – Godeke

+1

Para el registro: nunca he visto un cero devuelto por un PRNG. Y los he probado mucho hace unos meses :-) – Joey

3

Parece que lo que quiere hacer (elegir entre dos valores) se expresa más claramente con el método Next, en lugar del método NextDouble.

const int ExclusiveUpperBound = 2; 
if (new Random().Next(ExclusiveUpperBound) == 0) 

El valor producido es "mayor que o igual a cero, y menos de" ExclusiveUpperBound.

Cuestiones relacionadas