如何在 Dart 中生成随机数?

Posted

技术标签:

【中文标题】如何在 Dart 中生成随机数?【英文标题】:How do I generate random numbers in Dart? 【发布时间】:2012-07-25 08:46:30 【问题描述】:

如何使用 Dart 生成随机数?

【问题讨论】:

你怎么知道它们是坏数字?关于随机的事情是你永远无法真正分辨...i46.tinypic.com/2vw7237.gif 相信我,如果你使用 dart:core Math,你就会知道它们很糟糕。 :) 这是错误:code.google.com/p/dart/issues/detail?id=499 如果你想知道你的随机数是不是坏的,使用我的 ChiSquare 库来找出:github.com/kaisellgren/ChiSquare 【参考方案1】:

使用来自dart:mathRandom 类:

import 'dart:math';

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

截至撰写本文时,此代码已使用 Dart VM 和 dart2js 进行了测试。

【讨论】:

如果你想要加密的强随机数,最好阅读 /dev/urandomFile 类。 负随机数(双打)怎么样?我正在尝试实现一个 randomRange 方法,该方法将生成例如从 -0.8 到 0.9 ...结果将是例如 -0.32 @just_a_dude 这听起来像是 *** 的完美问题。考虑创建一个新问题:) 生成例如从 -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,而是使用 double 0-1,乘以 1,7 并移位 -0.8 new Random.secure() 来自 dart 1.1.4 的加密强随机数【参考方案2】:

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

【讨论】:

【参考方案3】:

这是一个用于生成随机数列表的 sn-p

import 'dart:math';

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

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

【讨论】:

【参考方案4】:

一个安全的随机 API 刚刚添加到 dart:math

new Random.secure()

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

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

【讨论】:

这个新的 API 在 1.14-dev 或更高版本中可用。【参考方案5】:

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

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

【讨论】:

【参考方案6】:

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

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

这适用于 Dartium、Chrome 和 Firefox,但可能不适用于其他浏览器,因为这是一个实验性 API。

【讨论】:

【参考方案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

【讨论】:

【参考方案8】:

它对我有用new Random().nextInt(100); // MAX = number

它会给出 0 到 99 个随机数

示例::

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

【讨论】:

【参考方案9】:

让我通过一个简单的掷骰子应用程序形式的实际示例来解决这个问题,该应用程序在点击时会随机调用 6 个骰子面图像中的 1 个到屏幕上。

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

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

static var _random = new Random();
static var _diceface = _random.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,
              ),
          )
        ),

每次您点击屏幕时都会生成一个新的随机数,并参考该数字来选择选择哪个骰子面图像。

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

Dice rolling app using random numbers in dart

【讨论】:

_random 应该是 _rnd,反之亦然【参考方案10】:

你可以通过这种方式简单地生成 有一个类名为 Random();

您可以使用它并生成随机数

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

【讨论】:

【参考方案11】:

刚刚编写了这个用于生成 Normal 随机数的小类......这是我需要做的检查的一个不错的起点。 (这些套装将分布在一个“钟”形 曲线。)种子将被随机设置,但如果您希望能够重新生成一个集合,您只需传递一些特定的种子,就会生成相同的集合。

玩得开心……

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 个 num 的集合的平均值。这些值存储在类中,因此可以在实例化后访问它们。

_swarmii

【讨论】:

【参考方案12】:

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

【讨论】:

我以前用过 DRandom。好库!【参考方案13】:

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

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

感谢@adam-singer 在here.的解释

【讨论】:

【参考方案14】:

使用Random 类生成随机数。您可以选择为 Random 构造函数提供种子。

var random = Random();
random.nextDouble(); // Between 0.0 and 1.0: [0, 1)
random.nextInt(10); // Between 0 and 9.

您甚至可以生成随机布尔值:

var random = Random();
random.nextBool(); // true or false

【讨论】:

【参考方案15】:

使用这个库http://dart.googlecode.com/svn/branches/bleeding_edge/dart/lib/math/random.dart 提供了一个很好的随机生成器,我认为它很快就会包含在 sdk 中,希望对您有所帮助

【讨论】:

现在在 SDK 中。有关如何使用它,请参阅我上面的答案。【参考方案16】:

使用 Dart 生成器,用于生成一系列数字或值。

 main() 
       print("Sequence Number");
       oddnum(10).forEach(print);
     
    Iterable<int> oddnum(int num) sync*
     int k=num;
     while(k>=0)
       if(k%2==1)
        yield k;
       
      k--;
      

【讨论】:

【参考方案17】:

使用 'dart:math' 库中的 Random() 类。

import 'dart:math';

void main() 
  int max = 10;
  int RandomNumber = Random().nextInt(max);
  print(RandomNumber);

这应该生成并打印一个从 0 到 9 的随机数。

【讨论】:

【参考方案18】:

一行解决方案,你也可以直接用构造函数调用所有函数。

import 'dart:math';

print(Random().nextInt(100));

【讨论】:

【参考方案19】:

此方法生成随机整数。最小值和最大值都包含在内。

确保将这一行添加到您的文件中:import 'dart:math'; 然后您可以添加并使用此方法:

int randomInt(int min, int max) 
return Random().nextInt(max - min + 1) + min;

因此,如果您调用 randomInt(-10,10),它将返回一个介于 -10 和 10 之间的数字(包括 -10 和 10)。

【讨论】:

以上是关于如何在 Dart 中生成随机数?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Dart 中生成大随机数?

如何在 Bash 中生成随机数?

如何在Javascript中生成随机数[重复]

如何在 django 中生成随机数

如何在 C++ 中生成随机数?

如何在 Elixir 中生成随机数?