¿Cómo genero números aleatorios en Dart?

128

¿Cómo genero números aleatorios usando Dart?

Seth Ladd
fuente
4
¿Cómo sabes que son malos números? Lo que pasa con el azar es que nunca se puede saber realmente ... i46.tinypic.com/2vw7237.gif
corsiKa
2
Créame, sabría que son malos si usa dart: core Math. :) Aquí está el error: code.google.com/p/dart/issues/detail?id=499
Seth Ladd
3
Si desea saber si sus números aleatorios son malos, use mi biblioteca ChiSquare para averiguarlo: github.com/kaisellgren/ChiSquare
Kai Sellgren

Respuestas:

180

Usar Randomclase de dart:math:

import 'dart:math';

main() {
  var rng = new Random();
  for (var i = 0; i < 10; i++) {
    print(rng.nextInt(100));
  }
}

Este código fue probado con Dart VM y dart2js, en el momento de escribir este artículo.

Seth Ladd
fuente
1
Es mejor que lea /dev/urandomcon la Fileclase si desea números aleatorios criptográficamente fuertes.
Torre
¿Qué hay de los números aleatorios negativos (dobles)? Estoy tratando de implementar un método randomRange que generaría, por ejemplo, de -0,8 a 0,9 ... el resultado sería, por ejemplo, -0,32
just_a_dude
2
@just_a_dude que suena como una pregunta perfecta para stackoverflow. Considere crear una nueva pregunta :)
Seth Ladd
1
El método que generaría, por ejemplo, de -0,8 a 0,9 es simple. Solo necesita mapear valores. Su rango es 0,8 + 0,9 = 1,7. Entonces, si pones rng.nextInt (1700) obtendrás un número entre 0 y 1700. Divide por 100 y reduce -0,8. Es decir, yourRnd = rng.nextInt (1700) /100.0-0.8. Hay más opciones que puede usar, como ni siquiera usar nextInt, sino duplicar 0-1, multiplicar por 1,7 y cambiar -0.8
Veljac
28

Puede lograrlo a través del Randomobjeto de clase random.nextInt(max), que está en la dart:mathbiblioteca. El nextInt()método requiere un límite máximo. El número aleatorio comienza desde 0y el límite máximo en sí es exclusivo.

import 'dart:math';
Random random = new Random();
int randomNumber = random.nextInt(100); // from 0 upto 99 included

Si desea agregar el límite mínimo, agregue el límite mínimo al resultado

int randomNumber = random.nextInt(90) + 10; // from 10 upto 99 included
Samir Rahimy
fuente
¿No incluye su respuesta números del 10 al 109?
Tim
@Tim, gracias por darte cuenta, acababa de copiar el código de la línea anterior. Lo resolvió.
Samir Rahimy
17

Si necesita números aleatorios criptográficamente seguros (por ejemplo, para el cifrado) y está en un navegador, puede utilizar la API de criptografía DOM :

int random() {
  final ary = new Int32Array(1);
  window.crypto.getRandomValues(ary);
  return ary[0];
}

Esto funciona en Dartium, Chrome y Firefox, pero probablemente no en otros navegadores, ya que se trata de una API experimental.

Sam McCall
fuente
17

Aquí hay un fragmento para generar una lista de números aleatorios

import 'dart:math';

main() {
  var rng = new Random();
  var l = new List.generate(12, (_) => rng.nextInt(100));
}

Esto generará una lista de 12 números enteros del 0 al 99 (inclusive).

Mark E. Haase
fuente
9

Se acaba de agregar una API aleatoria segura a dart:math

new Random.secure()

dart:math Randomagregó un secureconstructor que devuelve un generador aleatorio criptográficamente seguro que lee de la fuente de entropía proporcionada por el incrustador para cada valor aleatorio generado.

que delega window.crypto.getRandomValues()en el navegador y en el sistema operativo (como urandomen el servidor)

Günter Zöchbauer
fuente
Esta nueva API está disponible en 1.14-dev o superior.
Seth Ladd
7

No puedo comentar porque acabo de crear esta cuenta, pero quería asegurarme de señalar que la solución de @ eggrobot78 funciona, pero es exclusiva en dardo, por lo que no incluye el último número. Si cambia la última línea a "r = min + rnd.nextInt (max - min + 1);", entonces también debe incluir el último número.

Explicación:

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
fuente
4

prueba esto, puedes controlar el valor mínimo / máximo:

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
fuente
3

Una solución alternativa podría usar el siguiente código DRandom . Esta clase debe usarse con una semilla. Proporciona una interfaz familiar a lo que esperarías en .NET, fue portado de Random.cs de mono. Es posible que este código no sea seguro para la criptografía y no se ha probado estadísticamente.

Adán cantante
fuente
He usado DRandom antes. ¡Buena lib!
John Evans
3

Acabo de escribir esta pequeña clase para generar números aleatorios normales ... fue un punto de partida decente para la verificación que necesito hacer. (Estos conjuntos se distribuirán en una curva en forma de "campana".) La semilla se establecerá aleatoriamente, pero si desea poder volver a generar un conjunto, simplemente puede pasar alguna semilla específica y se generará el mismo conjunto.

Que te diviertas...

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

Entonces puede usarlo así para verificar la media de conjuntos de 1000 nums generados entre un límite bajo y alto. Los valores se almacenan en la clase para que se pueda acceder a ellos después de la instanciación.

_swarmii

george koller
fuente
1

Para mí, la forma más sencilla es hacer:

import 'dart:math';
Random rnd = new Random();
r = min + rnd.nextInt(max - min);
//where min and max should be specified.

Gracias a la explicación de @ adam-singer aquí.

eggrobot78
fuente
1

ha funcionado para mi new Random().nextInt(100); // MAX = number

le dará de 0 a 99 números aleatorios

Ejemplo:

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

Permítanme resolver esta pregunta con un ejemplo práctico en forma de una aplicación simple de lanzamiento de dados que llama a 1 de 6 imágenes de caras de dados al azar en la pantalla cuando se toca.

primero declare una variable que genere números aleatorios (no olvide importar dart.math). Luego declare una variable que analice el número aleatorio inicial dentro de las restricciones entre 1 y 6 como un entero.

Ambas variables son privadas estáticas para que se puedan inicializar una vez. Esto no es un gran problema, pero sería una buena práctica si tuviera que inicializar un montón de números aleatorios.

static var _random = new Random();
static var _diceface = _rnd.nextInt(6) +1 ;

Ahora cree un widget de detección de gestos con ClipRRect cuando era niño para devolver una de las seis imágenes de caras de dados a la pantalla cuando se toca.

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

Se genera un nuevo número aleatorio cada vez que toca la pantalla y se hace referencia a ese número para seleccionar qué imagen de cara de dados se elige.

Esperaba que este ejemplo ayudara :)

Aplicación para rodar dados usando números aleatorios en dardos

Nzuzo
fuente