2009-09-29 20 views
20

Sehe ich zu weit, um etwas so einfaches wie eine Zahl zu sehen: 0 oder 1?Zufallszahl: 0 oder 1

 Random rand = new Random(); 

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

Alle Lösungen unten, haben Sie ein neues zufälliges Objekt erstellen. Das ist in Ordnung, es sei denn, Sie erstellen eine Menge von ihnen sehr schnell. Wenn Sie dies tun, besteht eine gute Chance, dass alle denselben Zufallssamen haben und Sie immer wieder das gleiche Ergebnis erhalten. Um das Problem zu vermeiden, erstellen Sie irgendwo in Ihrem Programm einen Random und übergeben Sie ihn. –

+0

NextDouble existiert nicht in der zufälligen Klasse –

Antwort

71
Random rand = new Random(); 

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

Random.Next wählt eine zufällige ganze Zahl zwischen der unteren Grenze (einschließlich) und der oberen Grenze (exklusiv).

+0

Dies ist die eine, die ich gehen würde. – RichardOD

+8

Hinweis: Random rand = new Random(); sollte im Idealfall irgendwo anders stecken, nicht direkt über dem Ruf nach rand.Next. Im Idealfall sollte es einmal initialisiert werden. – Brian

26

Wenn Sie 50/50 Wahrscheinlichkeit wollen, schlage ich vor:

Random rand = new Random(); 

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

Yeap - derzeit ist die Wahrscheinlichkeit nicht annähernd. :-). – RichardOD

+2

Würde der Downvoter bitte einen Kommentar hinterlassen. Vielen Dank. –

2

Random.NextDouble() wird jede doppelte Zahl von 0 wählen, aber weniger als 1,0. Die meisten dieser Zahlen sind nicht Null, daher ist Ihre Verteilung nicht so gut wie erwartet.

+6

"nicht so, wie Sie es erwarten" ist Untertreibung des Jahres. Praktisch alle generierten Ergebnisse wären 1. – Godeke

+1

Für den Rekord: Ich habe nie gesehen, dass eine Null von einem PRNG zurückgegeben wird. Und ich habe sie vor ein paar Monaten viel getestet :-) – Joey

3

Es scheint, als ob das, was Sie tun möchten (wählen Sie zwischen zwei Werten) wird deutlicher ausgedrückt mit der Next Methode anstelle der NextDouble Methode.

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

Der Wert, der erzeugt ist „größer als oder gleich Null und kleiner als“ ExclusiveUpperBound.