Як генерувати випадкові числа за допомогою Dart?
Як генерувати випадкові числа за допомогою Dart?
Відповіді:
Використовувати Random
клас від dart:math
:
import 'dart:math';
main() {
var rng = new Random();
for (var i = 0; i < 10; i++) {
print(rng.nextInt(100));
}
}
Цей код був протестований з Dart VM та dart2js, станом на час написання цього документа.
/dev/urandom
з File
класом, якщо хочете криптографічно сильних випадкових чисел.
Ви можете досягти цього за допомогою Random
об'єкта класу random.nextInt(max)
, який знаходиться в dart:math
бібліотеці. nextInt()
Метод вимагає максимальної межі. Випадкове число починається з, 0
а сама максимальна межа є виключною.
import 'dart:math';
Random random = new Random();
int randomNumber = random.nextInt(100); // from 0 upto 99 included
Якщо ви хочете додати мінімальну межу, додайте мінімальну межу до результату
int randomNumber = random.nextInt(90) + 10; // from 10 upto 99 included
Якщо вам потрібні криптографічно захищені випадкові числа (наприклад, для шифрування), і ви перебуваєте в браузері, ви можете використовувати API криптографії DOM :
int random() {
final ary = new Int32Array(1);
window.crypto.getRandomValues(ary);
return ary[0];
}
Це працює в Dartium, Chrome та Firefox, але, швидше за все, не в інших браузерах, оскільки це експериментальний API.
Ось фрагмент для створення списку випадкових чисел
import 'dart:math';
main() {
var rng = new Random();
var l = new List.generate(12, (_) => rng.nextInt(100));
}
Це створить список з 12 цілих чисел від 0 до 99 (включно).
Щойно доданий безпечний випадковий API dart:math
new Random.secure()
dart:math
Random
додавsecure
конструктор, що повертає криптографічно захищений випадковий генератор, який зчитує з джерела ентропії, наданого вбудовувачем, для кожного створеного випадкового значення.
який делегує window.crypto.getRandomValues()
у браузері та ОС (як urandom
на сервері)
Не можу коментувати, оскільки я щойно створив цей обліковий запис, але хотів переконатися, що рішення @ eggrobot78 працює, але воно є ексклюзивним у дартсі, тому воно не включає останнє число. Якщо ви зміните останній рядок на "r = min + rnd.nextInt (max - min + 1);", він повинен включати і останнє число.
Пояснення:
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
Альтернативним рішенням може бути використання наступного коду DRandom . Цей клас слід використовувати з насінням. Він надає знайомий інтерфейс до того, що ви очікували б у .NET, він був перенесений з Mondom Random.cs. Цей код не є безпечним для криптографії та не пройшов статистичну перевірку.
Щойно написав цей маленький клас для генерації нормальних випадкових чисел ... це був гідний вихідний пункт для перевірки, що мені потрібно зробити. (Ці набори будуть поширюватися на кривій формі дзвоника.) Насіння буде встановлено випадковим чином, але якщо ви хочете мати можливість повторно генерувати набір, ви можете просто передати певне насіння і такий же набір генеруватиме.
Весело…
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);
Тоді ви можете просто використовувати його так, щоб перевірити середнє значення наборів з 1000 нумів, згенерованих між низьким і високим лімітом. Значення зберігаються у класі, щоб отримати доступ до них після інстанції.
_swarmii
користуйтеся цією бібліотекою http://dart.googlecode.com/svn/branches/bleeding_edge/dart/lib/math/random.dart забезпечив хороший генератор випадкових випадків, який, на мою думку, незабаром буде включений у sdk, сподіваюся, що це допоможе
Для мене найпростіший спосіб:
import 'dart:math';
Random rnd = new Random();
r = min + rnd.nextInt(max - min);
//where min and max should be specified.
Завдяки поясненню @ adam-співака тут.
це працювало для мене new Random().nextInt(100); // MAX = number
це дасть від 0 до 99 випадкове число
Eample ::
import 'dart:math';
int MAX = 100;
print(new Random().nextInt(MAX));`
Дозвольте мені вирішити це питання на практичному прикладі у вигляді простого додатка для прокатки кісток, який викликає 1 з 6 зображень обличчя кубиками випадково на екран при натисканні.
спочатку оголосіть змінну, яка генерує випадкові числа (не забудьте імпортувати dart.math). Потім оголосимо змінну, яка аналізує початкове випадкове число в межах обмежень між 1 і 6 як Ціле число.
Обидві змінні є статичними приватними, щоб їх ініціалізувати один раз. Це не велика справа, але було б хорошою практикою, якби вам довелося ініціалізувати цілу купу випадкових чисел.
static var _random = new Random();
static var _diceface = _rnd.nextInt(6) +1 ;
Тепер створіть віджет для виявлення жестів разом із ClipRRect, щоб повернути одне із шести зображень обличчя на кістки при натисканні.
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,
),
)
),
Щоразу, коли ви торкаєтесь екрана, генерується нове випадкове число, на яке посилається це число, щоб вибрати, яке обране зображення зображення кістки.
Я сподівався, що цей приклад допоміг :)
Додаток прокатки кісток з використанням випадкових чисел у дартсі