Das Problem ist die Hinzufügung. rand()
gibt einen int
Wert von zurück 0...RAND_MAX
. Wenn Sie also zwei davon hinzufügen, werden Sie aufstehen RAND_MAX * 2
. Wenn dies überschritten wird INT_MAX
, überschreitet das Ergebnis der Addition den gültigen Bereich, den ein int
halten kann. Ein Überlauf von vorzeichenbehafteten Werten ist ein undefiniertes Verhalten und kann dazu führen, dass Ihre Tastatur in Fremdsprachen mit Ihnen spricht.
Da das Hinzufügen von zwei zufälligen Ergebnissen hier keinen Vorteil bringt, besteht die einfache Idee darin, dies einfach nicht zu tun. Alternativ können Sie jedes Ergebnis unsigned int
vor der Addition umwandeln, wenn dies die Summe enthalten kann. Oder verwenden Sie einen größeren Typ. Beachten Sie, dass long
nicht notwendigerweise breiter ist als int
das gleiche gilt , long long
wenn int
mindestens 64 Bit!
Fazit: Vermeiden Sie einfach den Zusatz. Es bietet keine "Zufälligkeit" mehr. Wenn Sie mehr Bits benötigen, können Sie die Werte verketten sum = a + b * (RAND_MAX + 1)
, dies erfordert jedoch wahrscheinlich auch einen größeren Datentyp als int
.
Als Ihr angegebener Grund ist es, ein Null-Ergebnis zu vermeiden: Dies kann nicht vermieden werden, indem die Ergebnisse von zwei rand()
Aufrufen addiert werden , da beide Null sein können. Stattdessen können Sie einfach inkrementieren. Wenn RAND_MAX == INT_MAX
dies nicht möglich ist int
. Allerdings (unsigned int)rand() + 1
tut sehr, sehr wahrscheinlich. Wahrscheinlich (nicht definitiv), weil es erforderlich ist UINT_MAX > INT_MAX
, was für alle mir bekannten Implementierungen gilt (die einige eingebettete Architekturen, DSPs und alle Desktop-, Mobil- und Serverplattformen der letzten 30 Jahre abdecken).
Warnung:
Obwohl bereits hier in den Kommentaren bestreut, beachten Sie bitte , dass das Hinzufügen von zwei Zufallswerten nicht nicht erhält eine gleichmäßige Verteilung, sondern eine Dreiecksverteilung mit zwei Würfel wie walzen zu bekommen 12
(zwei Würfel) beiden Würfel zeigen müssen 6
. denn 11
es gibt bereits zwei mögliche Varianten: 6 + 5
oder 5 + 6
usw.
Daher ist der Zusatz auch in dieser Hinsicht schlecht.
Beachten Sie auch, dass die rand()
generierten Ergebnisse nicht unabhängig voneinander sind, da sie von einem Pseudozufallszahlengenerator generiert werden . Beachten Sie auch, dass der Standard nicht die Qualität oder gleichmäßige Verteilung der berechneten Werte festlegt.
rand()
kann nicht negativ sein ...