C # Random.Next - gibt niemals die Obergrenze zurück?

73
random.Next(0,5)

Es wird nie die 5 zurückgegeben (aber manchmal die 0). Warum? Ich dachte, dies sind nur Grenzwerte, die zurückgegeben werden können. Vielen Dank

FlyBoy
quelle
5
Warum wurde es so gemacht? Es ist unnötig verwirrend.
3
Warum? Wahrscheinlich aus diesem Grund: var randomValue = myArray [rand.Next (0, myArray.Length)];
Brett Allen
24
Ich fand diese Dokumentation schneller als das erneute Eingeben von Code und das Auslösen von Intellisense oder das Durchsuchen der MSDN-Bibliothek. Normalerweise geben Sie beim Debuggen oder Lesen von Code keinen Code ein. Ich habe "maxValue" intuitiv als "maximal möglichen Wert" gelesen, nicht als "maximaler Wert minus eins". Keine Notwendigkeit, das OP RTFM mitgeteilt zu haben.
JonH
7
Ich weiß, dass ich zu spät hier bin, aber ich bin völlig verblüfft darüber. Wie alle anderen auf der Welt habe ich "maxValue" als die größte Zahl gelesen, die diese Funktion zurückgibt. Ich bin mir ziemlich sicher, dass ich aus diesem Grund Code in der Produktion gebrochen habe.
Brandon
Seltsamerweise wird der maxValue zurückgegeben, wenn minValue == maxValue. Ebenso Next (0) (angeblich gibt ein impliziter minValue von 0 nur 0 zurück. Ziemlich wackelig auf belanglose Weise.
Josh Sutterfield

Antworten:

142

Der maxValuefür die oberen gebundenen im Next()Verfahren ist exklusiver -Der Bereich umfasst minValue, maxValue-1und alle Zahlen dazwischen.

Mark Cidade
quelle
12
Irgendwelche Gedanken darüber, warum sie sich entschieden haben, das eine inklusive und das andere exklusiv zu machen? Scheint etwas eigenartig ...
anakic
18
Ein Grund, an den ich denken kann, istarray[random.Next(0, array.Length)]
Mark Cidade
6
Der Name maxValue (wie der Parameter genannt wird) ist aktiv irreführend. Es sollte Upper Bound genannt werden. Da das Maximum immer ein Element einer Menge ist.
Harry Berry
1
@AntonioNakicAlfirevic - siehe hier für die Gründe für dieses Verhalten: programmers.stackexchange.com/questions/311250/…
Matt Wilko
5
Um die Verwirrung zu vergrößern, ist maxValue nicht mehr exklusiv, wenn Sie identische Werte für minValue und maxValue übergeben. Die Beschreibung "Gibt eine zufällige Ganzzahl zurück, die innerhalb eines bestimmten Bereichs liegt" ist ebenfalls irreführend.
EventHorizon
14

Die Dokumentation besagt, dass die Obergrenze exklusiv ist. Exklusiv bedeutet, dass es nicht im möglichen Rückgabesatz enthalten ist. In einer mathematischeren Notation 0 <= x < 5in diesem Fall.

Albin Sunnanbo
quelle
1
Dies gilt nicht für min = max. Wenn minValue gleich maxValue ist, wird minValue zurückgegeben.
Jasdefer
5
@jasdefer Warum wird in diesem Fall minValuestatt zurückgegeben maxValue?
qxz
@qxz Ich spreche nur über den Fall: minValue= maxValue. Hier spielt es keine Rolle, ob minValueoder maxValuezurückgegeben wird, weil sie gleich sind. minValue <= x < maxValueist nicht wahr. Wenn minValue= maxValue= 0, wird x = 0 zurückgegeben und 0 <0 ist nicht wahr.
Jasdefer
6

Direkt aus der Dokumentation:

 Summary:
   Returns a random number within a specified range.

 Parameters:
   minValue:
     The inclusive lower bound of the random number returned.

   maxValue:
     The exclusive upper bound of the random number returned. maxValue must be
     greater than or equal to minValue.

 Returns:
     A 32-bit signed integer greater than or equal to minValue and less than maxValue;
     that is, the range of return values includes minValue but not maxValue. If
     minValue equals maxValue, minValue is returned.

Wenn Sie sich die Parameter ansehen, werden Sie sehen, dass dies minValueinklusive ist (weshalb Ihre 0 auftritt) und maxValueexklusiv ist (Ihre 5 tritt nie auf).

Marlon
quelle
2

Eine gute Möglichkeit, sich daran zu erinnern, besteht darin, max als Anzahl von Zahlen zu betrachten, aus denen Zufallszahlen entnommen werden. Das random.Next(0,2)bedeutet, dass 2 Zahlen ab 0: 0 und 1 zufällig ausgewählt werden.

Idiot
quelle
1
Dies ist eine gute Möglichkeit, sich nur dann daran zu erinnern, wenn die angegebene Untergrenze 0 ist. Es ist nicht wahr, dass z. B. random.Next (1,2) eine zufällige Auswahl von 2 Zahlen ab 1
1

Dies wurde vor langer Zeit geschrieben, aber ich werde es trotzdem kommentieren. Ich denke, der Hauptgrund für diese Entwurfsentscheidung ist, dass die meisten, wenn nicht alle Zufallszahlengeneratoren in ihrem Kern Zahlen von 0 bis 2 ^ 32-1 erzeugen. Wenn Sie also Int32.MaxValue angeben, erhalten Sie diese Nummer nie. Eine Ausnahme für eine Nummer zu haben, muss für die Designer nicht akzeptabel gewesen sein, daher haben sie beschlossen, die Klammer exklusiv zu verwenden. Problem gelöst!

user7969
quelle
-1

Wenn Sie in Google nach "c # random" suchen und den ersten Links zu der Methode des Begehrens folgen, erhalten Sie hier: http://msdn.microsoft.com/en-us/library/aa329893(v=vs.71). aspx

Und es gibt keinen Hinweis auf die Exklusivität der Obergrenze. Sie müssen den Fehler im Code gefunden und mit Dokumentation korrigiert haben.

Daher ist es wichtig, immer die Version des Frameworks zu überprüfen, wenn Sie sich die Dokumentation ansehen. Auch bei der Arbeit mit alten Versionen des Frameworks lohnt es sich, einen Blick auf die neuere Dokumentation zu werfen.

Kurt
quelle
1
Folgen Sie dem Link, den Sie gepostet haben, und finden Sie Folgendes: "Rückgabewert - Eine 32-Bit-Ganzzahl mit Vorzeichen, die größer oder gleich minValue und kleiner als maxValue ist. Das heißt, der Bereich der Rückgabewerte umfasst minValue, aber nicht MaxValue. Wenn minValue gleich maxValue ist, minValue ist zurück gekommen."
Dbasnett
3
Wie dbasnett sagt, die Dokumentation tut hier das Verhalten angeben. Nicht nur das, sondern dies ist die herkömmliche Art, einen Bereich für so etwas wie Zufallszahlen zu definieren. Ihre Vermutung, dass dies tatsächlich ein Fehler war, ist schlecht, IMO.
Jon Skeet
Art von nicht intuitiv, um zuzulassen, dass der maxValue mit dem minValue identisch ist, da dies dazu führen sollte, dass der Satz gültiger Werte immer leer ist
Grubsnik