如何在Dart中生成随机数?

322

如何使用Dart生成随机数?


4
你如何知道这些数字是糟糕的呢?随机的事情在于你永远无法真正确定... http://i46.tinypic.com/2vw7237.gif - corsiKa
2
相信我,如果你使用dart:core Math,你会知道它们有多糟糕。:) 这是一个bug:http://code.google.com/p/dart/issues/detail?id=499 - Seth Ladd
3
如果您想知道随机数是否有问题,请使用我的ChiSquare库进行验证:https://github.com/kaisellgren/ChiSquare - Kai Sellgren
19个回答

391

使用dart:math中的Random类:

import 'dart:math';

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

此代码已在编写本文时使用Dart VM和dart2js进行测试。


1
如果您想要加密强度的随机数,最好使用File类读取/dev/urandom - Tower
1
负随机数(双精度浮点数)怎么处理呢? 我正在尝试实现一个randomRange方法,例如生成从-0.8到0.9的随机数...结果可能是-0.32。 - just_a_dude
6
@just_a_dude 这听起来像是一个完美的在stackoverflow上提问的问题。考虑创建一个新问题 :) - Seth Ladd
3
生成例如从-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之间的double,乘以1.7并向左移动-0.8。 - Veljac
4
在Dart 1.1.4中,使用new Random.secure()可以生成密码学强度的随机数。 - Sisir

155

你可以通过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

40

尝试这个,你可以控制最小/最大值:

注意需要导入dart数学库。

import 'dart:math';

void main() {
  
  int random(int min, int max) {
    return min + Random().nextInt(max - min);
  }

  print(random(5, 20)); // Output : 19, 5, 15.. (5 -> 19, 20 is not included)
}

31

这里是生成随机数列表的代码片段:

import 'dart:math';

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

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


27

dart:math 中刚刚添加了一个安全的随机 API。

new Random.secure()

dart:math Random新增了一个secure构造函数,返回一个加密安全的随机生成器,它为每个生成的随机值读取由嵌入程序提供的熵源。

在浏览器中委托给window.crypto.getRandomValues(),在服务器上则委托给操作系统(例如urandom


此新API在1.14-dev或更高版本中可用。 - Seth Ladd

19

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

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

这在Dartium、Chrome和Firefox中可以工作,但由于这是实验性API,很可能无法在其他浏览器中工作。


9
让我通过一个简单的骰子滚动应用程序来实际演示这个问题,当点击时,它会随机调用其中一种6面骰子的图像并显示在屏幕上。
首先声明一个生成随机数的变量(不要忘记导入dart.math)。然后声明一个将初始随机数解析为1到6之间的整数限制的变量。
这两个变量都是静态私有的,以便只初始化一次。虽然这不是什么大问题,但如果您需要初始化一堆随机数,这是一个好的做法。
static var _random = new Random();
static var _diceface = _random.nextInt(6) +1 ;

现在创建一个手势检测小部件,将ClipRRect作为其子元素,当被点击时返回其中的六个骰子面孔图像之一到屏幕上。
GestureDetector(
          onTap: () {
            setState(() {
              _diceface = _random.nextInt(6) +1 ;
            });
          },
          child: ClipRRect(
            clipBehavior: Clip.hardEdge,
            borderRadius: BorderRadius.circular(100.8),
              child: Image(
                image: AssetImage('images/diceface$_diceface.png'),
                fit: BoxFit.cover,
              ),
          )
        ),

每次触摸屏幕都会生成一个新的随机数,该随机数被引用以选择哪个骰子面图像被选中。
使用dart中的随机数实现掷骰子应用程序。

随机数应该是_rnd或反之。 - buckleyJohnson

8

这对我很有用 new Random().nextInt(100); // MAX = 数字

它会给出0到99之间的随机数。

例如:

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

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

6

您可以通过以下简单方式生成:

有一个名为Random()的类;

您可以使用它来生成随机数。

Random objectname = Random();
int number = objectname.nextInt(100);
// it will generate random number within 100.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接