如何在Dart中生成随机数?


126

如何使用Dart生成随机数?


4
您怎么知道他们是坏数字?关于随机的事情是,您永远无法真正分辨... 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 2012年

Answers:


178

使用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/urandomFile班级一起阅读。
2012年

负随机数(双精度)如何?我正在尝试实现一个randomRange方法,该方法将生成例如-0.8到0.9 ...的结果将是-0.32
just_a_dude13

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

26

您可以通过实现它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之间的数字?
蒂姆,

@Tim感谢您注意,我刚刚复制了上一行的代码。解决了。
Samir Rahimy

17

如果您需要加密安全的随机数(例如用于加密),并且您在浏览器中,则可以使用DOM加密API

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

这将生成一个从0到99(含)的12个整数的列表。


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..
}

3

一种替代解决方案可以使用以下代码DRandom。此类应与种子一起使用。它是从mono的Random.cs移植而来的,它为.NET提供了熟悉的界面。此代码可能不安全,并且未经统计测试。


我以前用过DRandom。好lib!
约翰·埃文斯

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 nums集的平均值。这些值存储在类中,因此可以在实例化之后对其进行访问。

_swarmii



1

对我来说,最简单的方法是:

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

感谢这里的 @ adam-singer解释


1

它为我工作 new Random().nextInt(100); // MAX = number

它将给出0到99个随机数

范例::

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

0

让我用一个简单的骰子滚动应用程序的形式来举例说明这个问题,该应用程序会在点击时将6个骰子脸部图像中的1个随机调用到屏幕上。

首先声明一个生成随机数的变量(别忘了导入dart.math)。然后将一个将初始随机数解析为1到6之间的约束的变量声明为Integer。

为了初始化一次,这两个变量都是静态私有的,这不是什么大问题,但是如果必须初始化一大堆随机数,这将是一个好习惯。

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

每次您点击屏幕时,都会生成一个新的随机数,并引用该数字以选择要选择的骰子脸部图像。

我希望这个例子有帮助:)

掷骰子的掷骰子应用程序

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.