Como faço para gerar números aleatórios no Dart?

126

Como faço para gerar números aleatórios usando o Dart?

Seth Ladd
fonte
4
Como você sabe que são números ruins? A coisa sobre aleatório é que você nunca pode realmente dizer ... i46.tinypic.com/2vw7237.gif
corsiKa
2
Confie em mim, você saberia que eles são ruins se você usasse dart: core Math. :) Aqui está o bug: code.google.com/p/dart/issues/detail?id=499
Seth Ladd
3
Se você quiser saber se seus números aleatórios são ruins, usar minha biblioteca qui-quadrado para descobrir: github.com/kaisellgren/ChiSquare
Kai Sellgren

Respostas:

178

Use a Randomclasse 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 foi testado com a Dart VM e o dart2js, no momento em que este artigo foi escrito.

Seth Ladd
fonte
1
É melhor ler /dev/urandomcom a Fileclasse se quiser números aleatórios criptograficamente fortes.
Torre
Que tal números aleatórios negativos (duplos)? Eu estou tentando implementar um método randomRange que geraria por exemplo, de -0.8 para 0.9 ... o resultado seria, por exemplo, -0.32
just_a_dude
2
@just_a_dude que soa como uma pergunta perfeita para o stackoverflow. Considere a criação de uma nova pergunta :)
Seth Ladd
1
O método que geraria, por exemplo, de -0,8 a 0,9 é simples. Você só precisa mapear valores. Seu alcance é 0,8 + 0,9 = 1,7. Portanto, se você colocar rng.nextInt (1700), obterá um número entre 0 e 1700. Divida por 100 e reduza -0,8. Significado yourRnd = rng.nextInt (1700) / 100.0-0.8. Há mais opções que você pode usar como nem mesmo usando nextInt mas sim duplo 0-1, miltiplied por 1,7 e mudou -0.8
Veljac
26

Você pode alcançá-lo através do Randomobjeto de classe random.nextInt(max), que está na dart:mathbiblioteca. O nextInt()método requer um limite máximo. O número aleatório começa 0e o próprio limite máximo é exclusivo.

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

Se você deseja adicionar o limite mínimo, adicione o limite mínimo ao resultado

int randomNumber = random.nextInt(90) + 10; // from 10 upto 99 included
Samir Rahimy
fonte
sua resposta não inclui números de 10 a 109 incluídos?
Tim
@ Tim obrigado por perceber, eu tinha acabado de copiar o código da linha anterior. Resolveu isso.
Samir Rahimy
17

Se você precisar de números aleatórios criptograficamente seguros (por exemplo, para criptografia) e estiver em um navegador, poderá usar a API de criptografia DOM :

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

Isso funciona no Dartium, Chrome e Firefox, mas provavelmente não em outros navegadores, pois é uma API experimental.

Sam McCall
fonte
17

Aqui está um trecho para gerar uma lista de números aleatórios

import 'dart:math';

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

Isso irá gerar uma lista de 12 números inteiros de 0 a 99 (inclusive).

Mark E. Haase
fonte
9

Uma API aleatória segura foi adicionada a dart:math

new Random.secure()

dart:math Randomadicionou um secureconstrutor retornando um gerador aleatório criptograficamente seguro que lê da fonte de entropia fornecida pelo incorporador para cada valor aleatório gerado.

que delega window.crypto.getRandomValues()no navegador e no sistema operacional (como urandomno servidor)

Günter Zöchbauer
fonte
Essa nova API está disponível em 1.14-dev ou superior.
Seth Ladd
7

Não pude comentar porque acabei de criar esta conta, mas queria ressaltar que a solução do @ eggrobot78 funciona, mas é exclusiva no dardo, portanto não inclui o último número. Se você alterar a última linha para "r = min + rnd.nextInt (max - min + 1);", também deverá incluir o último número.

Explicação:

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

tente isso, você pode controlar o 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
fonte
3

Uma solução alternativa pode estar usando o seguinte código DRandom . Esta classe deve ser usada com uma semente. Ele fornece uma interface familiar para o que você esperaria no .NET; foi transportado do Random.cs da mono. Este código pode não ser seguro para criptografia e não foi testado estatisticamente.

Adam-cantor
fonte
Eu usei o DRandom antes. Boa lib!
31912 John Evans
3

Acabei de escrever esta pequena turma para gerar números aleatórios normais ... foi um ponto de partida decente para a verificação que eu preciso fazer. (Esses conjuntos serão distribuídos em uma curva em forma de "sino".) A semente será definida aleatoriamente, mas se você quiser gerar novamente um conjunto, poderá passar apenas algumas sementes específicas e o mesmo conjunto será gerado.

Diverta-se...

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

Depois, você pode usá-lo assim para verificar a média de conjuntos de 1000 nums gerados entre um limite baixo e alto. Os valores são armazenados na classe para que possam ser acessados ​​após a instanciação.

_swarmii

george koller
fonte
1

Para mim, a maneira mais fácil é:

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

Graças à explicação do @ adam-singer aqui.

eggrobot78
fonte
1

funcionou para mim new Random().nextInt(100); // MAX = number

dará 0 a 99 num número aleatório

Exemplo ::

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

Deixe-me resolver esta questão com um exemplo prático na forma de um aplicativo simples de rolagem de dados que chama 1 de 6 imagens de dados aleatoriamente para a tela quando tocada.

primeiro declare uma variável que gera números aleatórios (não esqueça de importar dart.math). Em seguida, declare uma variável que analisa o número aleatório inicial dentro de restrições entre 1 e 6 como um número inteiro.

As duas variáveis ​​são privadas estáticas para serem inicializadas uma vez. Isso não é muito importante, mas seria uma boa prática se você tivesse que inicializar um monte de números aleatórios.

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

Agora, crie um widget de detecção de gestos com um ClipRRect quando criança para retornar uma das seis imagens de dados para a tela quando tocada.

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

Um novo número aleatório é gerado cada vez que você toca na tela e esse número é referenciado para selecionar qual imagem de face de dados é escolhida.

Eu esperava que este exemplo ajudasse :)

Dados rolando aplicativo usando números aleatórios no dardo

Nzuzo
fonte