Como faço para gerar números aleatórios usando o Dart?
Como faço para gerar números aleatórios usando o Dart?
Respostas:
Use a Random
classe 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.
/dev/urandom
com a File
classe se quiser números aleatórios criptograficamente fortes.
Você pode alcançá-lo através do Random
objeto de classe random.nextInt(max)
, que está na dart:math
biblioteca. O nextInt()
método requer um limite máximo. O número aleatório começa 0
e 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
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.
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).
Uma API aleatória segura foi adicionada a dart:math
new Random.secure()
dart:math
Random
adicionou umsecure
construtor 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 urandom
no servidor)
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
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.
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
use esta biblioteca http://dart.googlecode.com/svn/branches/bleeding_edge/dart/lib/math/random.dart forneceu um bom gerador aleatório que eu acho que será incluído no sdk em breve espero que ajude
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.
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 :)