Как сгенерировать случайные числа в Dart?

128

Как сгенерировать случайные числа с помощью Dart?

Сет Лэдд
источник
4
Откуда вы знаете, что это плохие числа? Особенность random в том, что вы никогда не сможете точно сказать ... i46.tinypic.com/2vw7237.gif
corsiKa
2
Поверьте, вы бы знали, что они плохие, если бы использовали dart: core Math. :) Вот ошибка: code.google.com/p/dart/issues/detail?id=499
Сет Лэдд,
3
Если вы хотите узнать, плохи ли ваши случайные числа, воспользуйтесь моей библиотекой ChiSquare, чтобы узнать: github.com/kaisellgren/ChiSquare
Kai Sellgren

Ответы:

180

Используйте Randomкласс из dart:math:

import 'dart:math';

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

Этот код был протестирован с виртуальной машиной Dart и 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-dev или выше.
Сет Лэдд,
7

Не могу комментировать, потому что я только что создал эту учетную запись, но я хотел отметить, что решение @ eggrobot78 работает, но оно эксклюзивно для dart, поэтому оно не включает последний номер. Если вы измените последнюю строку на «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

попробуйте это, вы можете контролировать минимальное / максимальное значение:

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
источник
3

Альтернативным решением может быть использование следующего кода DRandom . Этот класс следует использовать с семенем. Он обеспечивает знакомый интерфейс того, что вы ожидаете от .NET, он был перенесен из моно-файла Random.cs. Этот код может быть небезопасным для криптографии и не был статистически протестирован.

адам-певец
источник
Раньше я пользовался DRandom. Хорошая библиотека!
John Evans
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, надеюсь, это поможет

kaiser avm
источник
Теперь это в SDK. См. Мой ответ выше, чтобы узнать, как его использовать.
Сет Лэдд,
1

Для меня проще всего сделать:

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

Благодаря объяснению здесь @ adam -inger .

eggrobot78
источник
1

это сработало для меня new Random().nextInt(100); // MAX = number

он даст от 0 до 99 случайное число

Eample ::

import 'dart:math';
int MAX = 100;
print(new Random().nextInt(MAX));`
Д.В. Йогеш
источник
0

Позвольте мне решить этот вопрос на практическом примере в виде простого приложения для катания игральных костей, которое при нажатии случайным образом вызывает на экран одно из 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,
              ),
          )
        ),

Новое случайное число генерируется каждый раз, когда вы касаетесь экрана, и на это число ссылаются, чтобы выбрать изображение лица игральной кости.

Я надеялся, что этот пример помог :)

Приложение для игры в кости с использованием случайных чисел в дротике

Nzuzo
источник