Come si generano numeri casuali in Dart?


128

Come faccio a generare numeri casuali usando Dart?


4
Come fai a sapere che sono numeri cattivi? Il problema del
corsiKa

2
Credimi, sapresti che sono pessimi se usassi dart: core Math. :) Ecco il bug: code.google.com/p/dart/issues/detail?id=499
Seth Ladd

3
Se vuoi sapere se i tuoi numeri casuali sono pessimi, usa la mia libreria ChiSquare per scoprirlo: github.com/kaisellgren/ChiSquare
Kai Sellgren

Risposte:


180

Usa Randomclasse 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.


1
È meglio leggere /dev/urandomcon la Fileclasse se vuoi numeri casuali crittograficamente forti.
Torre

Che ne dici di numeri casuali negativi (doppi)? Sto cercando di implementare un metodo randomRange che genererebbe ad esempio da -0.8 a 0.9 ... il risultato sarebbe ad esempio
-0.32

2
@just_a_dude che suona come una domanda perfetta per stackoverflow. Considera l'idea di creare una nuova domanda :)
Seth Ladd

1
metodo che genererebbe ad esempio da -0,8 a 0,9 è semplice. Hai solo bisogno di mappare i valori. Il tuo intervallo è 0,8 + 0,9 = 1,7. Quindi se metti rng.nextInt (1700) otterrai un numero compreso tra 0 e 1700. Dividi per 100 e riduci -0,8. Significato yourRnd = rng.nextInt (1700) /100.0-0.8. Ci sono più opzioni che puoi usare come non usare nemmeno nextInt ma piuttosto doppio 0-1, miltiplied di 1,7 e spostato di -0.8
Veljac

28

Puoi ottenerlo tramite l' Randomoggetto di classe random.nextInt(max), che si trova nella dart:mathlibreria. Il nextInt()metodo richiede un limite massimo. Il numero casuale inizia da 0e 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

la tua risposta non include numeri da 10 a 109 inclusi?
Tim

@Tim grazie per averlo notato, avevo appena copiato il codice dalla riga precedente. Risolto.
Samir Rahimy

17

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.


17

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


9

È stata appena aggiunta un'API casuale sicura a dart:math

new Random.secure()

dart:math Randomaggiunto un securecostruttore 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 urandomsul server)


Questa nuova API è disponibile in 1.14-dev o superiore.
Seth Ladd

7

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

4

prova questo, puoi controllare il valore min / max:

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..
}

3

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 già usato DRandom. Buona lib!
John Evans,

3

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



1

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.


1

ha funzionato per me new Random().nextInt(100); // MAX = number

darà da 0 a 99 numeri casuali

eample ::

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

0

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

Dice rolling app utilizzando numeri casuali in freccette

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.