Come faccio a generare numeri casuali usando Dart?
Come faccio a generare numeri casuali usando Dart?
Risposte:
Usa Random
classe da dart:math
:
import 'dart:math';
main() {
var rng = new Random();
for (var i = 0; i < 10; i++) {
print(rng.nextInt(100));
}
}
Questo codice è stato testato con Dart VM e dart2js, al momento della stesura di questo documento.
/dev/urandom
con la File
classe se vuoi numeri casuali crittograficamente forti.
Puoi ottenerlo tramite l' Random
oggetto di classe random.nextInt(max)
, che si trova nella dart:math
libreria. Il nextInt()
metodo richiede un limite massimo. Il numero casuale inizia da 0
e il limite massimo stesso è esclusivo.
import 'dart:math';
Random random = new Random();
int randomNumber = random.nextInt(100); // from 0 upto 99 included
Se desideri aggiungere il limite minimo, aggiungi il limite minimo al risultato
int randomNumber = random.nextInt(90) + 10; // from 10 upto 99 included
Se hai bisogno di numeri casuali crittograficamente protetti (ad esempio per la crittografia) e sei in un browser, puoi utilizzare l' API di crittografia DOM :
int random() {
final ary = new Int32Array(1);
window.crypto.getRandomValues(ary);
return ary[0];
}
Funziona in Dartium, Chrome e Firefox, ma probabilmente non in altri browser poiché si tratta di un'API sperimentale.
Ecco uno snippet per generare un elenco di numeri casuali
import 'dart:math';
main() {
var rng = new Random();
var l = new List.generate(12, (_) => rng.nextInt(100));
}
Questo genererà un elenco di 12 numeri interi da 0 a 99 (inclusi).
È stata appena aggiunta un'API casuale sicura a dart:math
new Random.secure()
dart:math
Random
aggiunto unsecure
costruttore che restituisce un generatore casuale crittograficamente sicuro che legge dalla sorgente di entropia fornita dall'incorporatore per ogni valore casuale generato.
che delega al window.crypto.getRandomValues()
browser e al sistema operativo (come urandom
sul server)
Non in grado di commentare perché ho appena creato questo account, ma volevo assicurarmi di far notare che la soluzione di @ eggrobot78 funziona, ma è esclusiva in dart quindi non include l'ultimo numero. Se si modifica l'ultima riga in "r = min + rnd.nextInt (max - min + 1);", dovrebbe includere anche l'ultimo numero.
Spiegazione:
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
Una soluzione alternativa potrebbe essere l'utilizzo del seguente codice DRandom . Questa classe dovrebbe essere usata con un seme. Fornisce un'interfaccia familiare a ciò che ti aspetteresti in .NET, è stato portato da Random.cs di mono. Questo codice potrebbe non essere sicuro per la crittografia e non è stato testato statisticamente.
Ho appena scritto questa piccola classe per generare Normal numeri casuali ... è stato un buon punto di partenza per il controllo che devo fare. (Questi set si distribuiranno su una curva a forma di "campana".) Il seme sarà impostato in modo casuale, ma se vuoi essere in grado di rigenerare un set puoi semplicemente passare un seme specifico e lo stesso set verrà generato.
Divertiti...
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);
Quindi puoi semplicemente usarlo in questo modo per controllare la media di set di 1000 numeri generati tra un limite basso e uno alto. I valori vengono memorizzati nella classe in modo che sia possibile accedervi dopo l'istanza.
_swarmii
usa questa libreria http://dart.googlecode.com/svn/branches/bleeding_edge/dart/lib/math/random.dart ha fornito un buon generatore casuale che penso sarà incluso nell'SDK presto spero che aiuti
Per me il modo più semplice è fare:
import 'dart:math';
Random rnd = new Random();
r = min + rnd.nextInt(max - min);
//where min and max should be specified.
Grazie alla spiegazione di @ adam-singer qui.
Permettimi di risolvere questa domanda con un esempio pratico sotto forma di una semplice app che lancia i dadi che richiama casualmente 1 di 6 immagini di facce di dadi sullo schermo quando viene toccato.
prima dichiara una variabile che genera numeri casuali (non dimenticare di importare dart.math). Quindi dichiara una variabile che analizza il numero casuale iniziale entro vincoli compresi tra 1 e 6 come numero intero.
Entrambe le variabili sono private statiche per poter essere inizializzate una volta sola. Questo non è un grosso problema, ma sarebbe una buona pratica se dovessi inizializzare un intero gruppo di numeri casuali.
static var _random = new Random();
static var _diceface = _rnd.nextInt(6) +1 ;
Ora crea un widget di rilevamento dei gesti con ClipRRect da bambino per restituire una delle sei immagini dei volti dei dadi sullo schermo quando viene toccato.
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,
),
)
),
Ogni volta che tocchi lo schermo viene generato un nuovo numero casuale e viene fatto riferimento a quel numero per selezionare l'immagine della faccia del dado scelta.
Speravo che questo esempio aiutasse :)