Wie generiere ich Zufallszahlen mit Dart?
Wie generiere ich Zufallszahlen mit Dart?
Antworten:
Verwenden Sie die Random
Klasse von dart:math
:
import 'dart:math';
main() {
var rng = new Random();
for (var i = 0; i < 10; i++) {
print(rng.nextInt(100));
}
}
Dieser Code wurde zum Zeitpunkt des Schreibens mit der Dart VM und dart2js getestet.
/dev/urandom
mit der File
Klasse lesen, wenn Sie kryptografisch starke Zufallszahlen möchten.
Sie können dies über ein Random
Klassenobjekt erreichen random.nextInt(max)
, das sich in der dart:math
Bibliothek befindet. Die nextInt()
Methode erfordert eine maximale Grenze. Die Zufallszahl beginnt bei 0
und das maximale Limit selbst ist exklusiv.
import 'dart:math';
Random random = new Random();
int randomNumber = random.nextInt(100); // from 0 upto 99 included
Wenn Sie das Mindestlimit hinzufügen möchten, fügen Sie dem Ergebnis das Mindestlimit hinzu
int randomNumber = random.nextInt(90) + 10; // from 10 upto 99 included
Wenn Sie kryptografisch sichere Zufallszahlen benötigen (z. B. zur Verschlüsselung) und sich in einem Browser befinden, können Sie die DOM-Kryptografie-API verwenden :
int random() {
final ary = new Int32Array(1);
window.crypto.getRandomValues(ary);
return ary[0];
}
Dies funktioniert in Dartium, Chrome und Firefox, aber wahrscheinlich nicht in anderen Browsern, da dies eine experimentelle API ist.
Hier ist ein Ausschnitt zum Generieren einer Liste von Zufallszahlen
import 'dart:math';
main() {
var rng = new Random();
var l = new List.generate(12, (_) => rng.nextInt(100));
}
Dadurch wird eine Liste mit 12 Ganzzahlen von 0 bis einschließlich 99 generiert.
Eine sichere zufällige API wurde gerade hinzugefügt dart:math
new Random.secure()
dart:math
Random
fügte einensecure
Konstruktor hinzu , der einen kryptografisch sicheren Zufallsgenerator zurückgibt, der für jeden generierten Zufallswert aus der vom Einbetter bereitgestellten Entropiequelle liest.
die window.crypto.getRandomValues()
im Browser und an das Betriebssystem delegiert (wie urandom
auf dem Server)
Ich kann keinen Kommentar abgeben, da ich gerade dieses Konto erstellt habe. Ich wollte jedoch darauf hinweisen, dass die Lösung von @ eggrobot78 funktioniert, sie ist jedoch exklusiv in Dart, sodass sie nicht die letzte Nummer enthält. Wenn Sie die letzte Zeile in "r = min + rnd.nextInt (max - min + 1);" ändern, sollte sie auch die letzte Zahl enthalten.
Erläuterung:
max = 5;
min = 3;
Random rnd = new Random();
r = min + rnd.nextInt(max - min);
//max - min is 2
//nextInt is exclusive so nextInt will return 0 through 1
//3 is added so the line will give a number between 3 and 4
//if you add the "+ 1" then it will return a number between 3 and 5
Eine alternative Lösung könnte die Verwendung des folgenden Codes DRandom sein . Diese Klasse sollte mit einem Samen verwendet werden. Es bietet eine vertraute Schnittstelle zu dem, was Sie in .NET erwarten würden. Es wurde aus monos Random.cs portiert. Dieser Code ist möglicherweise nicht kryptografiesicher und wurde nicht statistisch getestet.
Ich habe gerade diese kleine Klasse geschrieben, um normale Zufallszahlen zu generieren ... es war ein anständiger Ausgangspunkt für die Überprüfung, die ich durchführen muss. (Diese Sätze verteilen sich auf einer "glockenförmigen" Kurve.) Der Startwert wird zufällig festgelegt. Wenn Sie jedoch einen Satz neu generieren möchten, können Sie einfach einen bestimmten Startwert übergeben, und derselbe Satz wird generiert.
Habe Spaß...
class RandomNormal {
num _min, _max, _sum;
int _nEle, _seed, _hLim;
Random _random;
List _rNAr;
//getter
List get randomNumberAr => _rNAr;
num _randomN() {
int r0 = _random.nextInt(_hLim);
int r1 = _random.nextInt(_hLim);
int r2 = _random.nextInt(_hLim);
int r3 = _random.nextInt(_hLim);
num rslt = _min + (r0 + r1 + r2 + r3) / 4000.0; //Add the OS back in...
_sum += rslt; //#DEBUG ONLY
return( rslt );
}
RandomNormal(this._nEle, this._min, this._max, [this._seed = null]) {
if (_seed == null ) {
Random r = new Random();
_seed = r.nextInt(1000);
}
_hLim = (_max - _min).ceil() * 1000;
_random = new Random(_seed);
_rNAr = [];
_sum = 0;//#DEBUG ONLY
h2("RandomNormal with k: ${_nEle}, Seed: ${_seed}, Min: ${_min}, Max: ${_max}");//#DEBUG ONLY
for(int n = 0; n < _nEle; n++ ){
num randomN = _randomN();
//p("randomN = ${randomN}");
LIST_add( _rNAr, randomN );
}
h3("Mean = ${_sum/_nEle}");//#DEBUG ONLY
}
}
new RandomNormal(1000, 80, 120);
new RandomNormal(1000, 80, 120);
new RandomNormal(1000, 80, 120);
new RandomNormal(1000, 80, 120);
new RandomNormal(1000, 80, 120);
new RandomNormal(1000, 80, 120);
new RandomNormal(1000, 80, 120);
Dann können Sie es einfach so verwenden, um den Mittelwert von Sätzen von 1000 Zahlen zu überprüfen, die zwischen einem unteren und einem oberen Grenzwert erzeugt wurden. Die Werte werden in der Klasse gespeichert, damit nach der Instanziierung auf sie zugegriffen werden kann.
_swarmii
verwenden diese Bibliothek http://dart.googlecode.com/svn/branches/bleeding_edge/dart/lib/math/random.dart einen guten Zufallsgenerator zur Verfügung gestellt , die ich denke , wird in der sdk aufgenommen werden bald hoffe , es hilft
Für mich ist der einfachste Weg:
import 'dart:math';
Random rnd = new Random();
r = min + rnd.nextInt(max - min);
//where min and max should be specified.
Vielen Dank an @ Adam-Singer Erklärung hier.
Lassen Sie mich diese Frage mit einem praktischen Beispiel in Form einer einfachen Würfelwurf-App lösen, die beim Tippen 1 von 6 Würfelgesichtsbildern zufällig auf den Bildschirm ruft.
Deklarieren Sie zuerst eine Variable, die Zufallszahlen generiert (vergessen Sie nicht, dart.math zu importieren). Deklarieren Sie dann eine Variable, die die anfängliche Zufallszahl innerhalb von Einschränkungen zwischen 1 und 6 als Ganzzahl analysiert.
Beide Variablen sind statisch privat, um einmal initialisiert zu werden. Dies ist keine große Sache, aber es wäre eine gute Praxis, wenn Sie eine ganze Reihe von Zufallszahlen initialisieren müssten.
static var _random = new Random();
static var _diceface = _rnd.nextInt(6) +1 ;
Erstellen Sie nun als Kind ein Widget zur Gestenerkennung mit einem ClipRRect, um beim Tippen eines der sechs Würfelgesichtsbilder auf den Bildschirm zurückzugeben.
GestureDetector(
onTap: () {
setState(() {
_diceface = _rnd.nextInt(6) +1 ;
});
},
child: ClipRRect(
clipBehavior: Clip.hardEdge,
borderRadius: BorderRadius.circular(100.8),
child: Image(
image: AssetImage('images/diceface$_diceface.png'),
fit: BoxFit.cover,
),
)
),
Jedes Mal, wenn Sie auf den Bildschirm tippen, wird eine neue Zufallszahl generiert, auf die verwiesen wird, um auszuwählen, welches Würfelgesichtsbild ausgewählt wird.
Ich habe gehofft, dieses Beispiel hat geholfen :)