In SQLite
Die Funktion
random()
gibt eine pseudozufällige Ganzzahl zwischen -9223372036854775808 und +9223372036854775807 zurück.
Sie können mit Select random() % n ;
Aber das erzeugt immer noch negative Zahlen. Wie kann ich in SQLite nur positive Zufallszahlen erzeugen?
Verwenden Sie die Funktion ABS()
(absoluter Wert):
Beachten Sie Folgendes:
Wenn X die ganze Zahl -9223372036854775808 ist, dann löst
abs(X)
einen Integer-Überlauffehler aus, da es keinen gleichwertigen positiven 64-Bit-Zweierkomplementwert gibt.
Ihre Methode random() % n
zum Abrufen einer Zufallszahl innerhalb eines bestimmten Bereichs ist fehlerhaft, da dies zu einer ungleichmäßigen Verteilung führt. Die Zahl Null kommt doppelt so oft vor wie jede andere Zahl.
Übrigens ist die Verwendung von ABS
, um die Zahlen positiv zu machen, genau entgegengesetzt fehlerhaft, so dass die Zahl Null halb so oft auftaucht wie jede andere Zahl, so dass sie sich gegenseitig aufheben.
und
%Vor%beide tend , um das gewünschte Ergebnis zu erzielen.
Für mich ist das zweite besser lesbar. Zuerst wählen wir zufällig eine ganze Zahl aus, dann wenden wir ABS () an, um sicherzustellen, dass sie nicht negativ ist, und dann modulieren wir sie mit N, um den geeigneten Bereich auszuwählen.
Die erste Methode ist jedoch zuverlässiger. Die zweite Methode hat ein sehr niedriges, aber nicht Nulles Risiko, einen ganzzahligen Überlauf auszulösen, wie von NullUserException festgestellt.