Wie generiere ich Zufallszahlen in Dart?

126

Wie generiere ich Zufallszahlen mit Dart?

Seth Ladd
quelle
4
Woher weißt du, dass es schlechte Zahlen sind? Die Sache mit dem Zufall ist, dass man nie wirklich sagen kann ... i46.tinypic.com/2vw7237.gif
corsiKa
2
Vertrauen Sie mir, Sie würden wissen, dass sie schlecht sind, wenn Sie Dart: Core Math verwenden. :) Hier ist der Fehler: code.google.com/p/dart/issues/detail?id=499
Seth Ladd
3
Wenn Sie wissen möchten, ob Ihre Zufallszahlen schlecht sind, verwenden Sie meine ChiSquare-Bibliothek, um dies herauszufinden: github.com/kaisellgren/ChiSquare
Kai Sellgren

Antworten:

176

Verwenden Sie die RandomKlasse 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.

Seth Ladd
quelle
1
Sie sollten besser /dev/urandommit der FileKlasse lesen, wenn Sie kryptografisch starke Zufallszahlen möchten.
Turm
Wie wäre es mit negativen Zufallszahlen (Doppel)? Ich versuche eine randomRange-Methode zu implementieren, die zum Beispiel von -0,8 bis 0,9 generiert ... das Ergebnis wäre zum Beispiel -0,32
just_a_dude
2
@just_a_dude, das klingt nach einer perfekten Frage für den Stackoverflow. Erwägen Sie, eine neue Frage zu erstellen :)
Seth Ladd
1
Methode, die zum Beispiel von -0,8 bis 0,9 erzeugen würde, ist einfach. Sie müssen nur Werte zuordnen. Ihr Bereich beträgt 0,8 + 0,9 = 1,7. Wenn Sie also rng.nextInt (1700) eingeben, erhalten Sie eine Zahl zwischen 0 und 1700. Teilen Sie durch 100 und reduzieren Sie -0,8. Bedeutung yourRnd = rng.nextInt (1700) /100.0-0.8. Es gibt mehr Optionen, die Sie verwenden können, als würden Sie nicht einmal nextInt verwenden, sondern doppelt 0-1, multipliziert mit 1,7 und verschoben -0,8
Veljac
25

Sie können dies über ein RandomKlassenobjekt erreichen random.nextInt(max), das sich in der dart:mathBibliothek befindet. Die nextInt()Methode erfordert eine maximale Grenze. Die Zufallszahl beginnt bei 0und 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
Samir Rahimy
quelle
Enthält Ihre Antwort nicht Zahlen von 10 bis 109?
Tim
@ Tim, danke, dass du es bemerkt hast. Ich hatte gerade den Code aus der vorherigen Zeile kopiert. Es wurde behoben.
Samir Rahimy
17

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.

Sam McCall
quelle
17

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.

Mark E. Haase
quelle
9

Eine sichere zufällige API wurde gerade hinzugefügt dart:math

new Random.secure()

dart:math Randomfügte einen secureKonstruktor 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 urandomauf dem Server)

Günter Zöchbauer
quelle
Diese neue API ist in Version 1.14-dev oder höher verfügbar.
Seth Ladd
7

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
Chad McAdams
quelle
4

Versuchen Sie dies, Sie können den Min / Max-Wert steuern:

import 'dart:math';

void main(){
  random(min, max){
    var rn = new Random();
    return min + rn.nextInt(max - min);
  }
  print(random(5,20)); // Output : 19, 6, 15..
}
Aymen
quelle
3

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.

Adam-Sänger
quelle
Ich habe DRandom schon einmal benutzt. Gute lib!
John Evans
3

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

george koller
quelle
1

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.

Eggrobot78
quelle
1

Es hat bei mir funktioniert new Random().nextInt(100); // MAX = number

es wird 0 bis 99 Zufallszahl geben

Beispiel ::

import 'dart:math';
int MAX = 100;
print(new Random().nextInt(MAX));`
DV Yogesh
quelle
0

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 :)

Würfel rollende App mit Zufallszahlen im Pfeil

Nzuzo
quelle