Як генерувати випадкові числа у Дарті?


127

Як генерувати випадкові числа за допомогою Dart?


4
Звідки ти знаєш, що вони погані? Справа в випадковому випадку полягає в тому, що ти ніколи не можеш сказати ... i46.tinypic.com/2vw7237.gif
corsiKa

2
Повірте, ви б знали, що вони погані, якби ви використовували dart: core Math. :) Ось помилка: code.google.com/p/dart/isissue/detail?id=499
Seth Ladd

3
Якщо ви хочете дізнатися, чи ваші випадкові числа погані, скористайтеся моєю бібліотекою ChiSquare, щоб дізнатися: github.com/kaisellgren/ChiSquare
Kai Sellgren

Відповіді:


179

Використовувати 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, станом на час написання цього документа.


1
Вам краще читати /dev/urandomз Fileкласом, якщо хочете криптографічно сильних випадкових чисел.
Вежа

Як щодо негативних випадкових чисел (парних)? Я намагаюся реалізувати метод randomRange, який би генерував, наприклад, від -0,8 до 0,9 ... результат був би, наприклад, -0,32
just_a_dude

2
@just_a_dude, що здається ідеальним питанням для stackoverflow. Поміркуйте над створенням нового питання :)
Сет Ладд

1
метод, який генерував би, наприклад, від -0,8 до 0,9, простий. Вам просто потрібно зіставити значення. Ваш діапазон 0,8 + 0,9 = 1,7. Тож якщо ви поставите rng.nextInt (1700), ви отримаєте число від 0 до 1700. Діліться на 100 і зменшіть -0,8. Значення yourRnd = rng.nextInt (1700) /100.0-0.8. Є більше варіантів, якими ви можете скористатися, навіть не використовуючи nextInt, але скоріше подвійний 0-1, змінений на 1,7 і зміщений -0,8
Veljac

28

Ви можете досягти цього за допомогою 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

чи не включається у вашу відповідь цифри від 10 до 109?
Тім

@ Дякую, що помітили, я щойно скопіював код з попереднього рядка. Вирішили це.
Самір Рахімі

17

Якщо вам потрібні криптографічно захищені випадкові числа (наприклад, для шифрування), і ви перебуваєте в браузері, ви можете використовувати API криптографії DOM :

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

Це працює в Dartium, Chrome та Firefox, але, швидше за все, не в інших браузерах, оскільки це експериментальний API.


17

Ось фрагмент для створення списку випадкових чисел

import 'dart:math';

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

Це створить список з 12 цілих чисел від 0 до 99 (включно).


9

Щойно доданий безпечний випадковий API dart:math

new Random.secure()

dart:math Randomдодав secureконструктор, що повертає криптографічно захищений випадковий генератор, який зчитує з джерела ентропії, наданого вбудовувачем, для кожного створеного випадкового значення.

який делегує window.crypto.getRandomValues()у браузері та ОС (як urandomна сервері)


Цей новий API доступний у 1,14-розрядника або більше.
Сет Ладд

7

Не можу коментувати, оскільки я щойно створив цей обліковий запис, але хотів переконатися, що рішення @ 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

4

спробуйте це, ви можете контролювати значення 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

Альтернативним рішенням може бути використання наступного коду DRandom . Цей клас слід використовувати з насінням. Він надає знайомий інтерфейс до того, що ви очікували б у .NET, він був перенесений з Mondom Random.cs. Цей код не є безпечним для криптографії та не пройшов статистичну перевірку.


Я раніше використовував DRandom. Гарна лайка!
Джон Еванс

3

Щойно написав цей маленький клас для генерації нормальних випадкових чисел ... це був гідний вихідний пункт для перевірки, що мені потрібно зробити. (Ці набори будуть поширюватися на кривій формі дзвоника.) Насіння буде встановлено випадковим чином, але якщо ви хочете мати можливість повторно генерувати набір, ви можете просто передати певне насіння і такий же набір генеруватиме.

Весело…

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


1

користуйтеся цією бібліотекою http://dart.googlecode.com/svn/branches/bleeding_edge/dart/lib/math/random.dart забезпечив хороший генератор випадкових випадків, який, на мою думку, незабаром буде включений у sdk, сподіваюся, що це допоможе


Це зараз у SDK. Дивіться мою відповідь вище, як її використовувати.
Сет Ладд

1

Для мене найпростіший спосіб:

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

Завдяки поясненню @ adam-співака тут.


1

це працювало для мене new Random().nextInt(100); // MAX = number

це дасть від 0 до 99 випадкове число

Eample ::

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

0

Дозвольте мені вирішити це питання на практичному прикладі у вигляді простого додатка для прокатки кісток, який викликає 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,
              ),
          )
        ),

Щоразу, коли ви торкаєтесь екрана, генерується нове випадкове число, на яке посилається це число, щоб вибрати, яке обране зображення зображення кістки.

Я сподівався, що цей приклад допоміг :)

Додаток прокатки кісток з використанням випадкових чисел у дартсі

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.