首页 > 解决方案 > 如果不需要加密强的随机数,使用 Random() 优于 Random.secure() 是否有优势?

问题描述

Dart 有两种不同的生成随机数的方法。Random()Random.secure(),其中前者是伪随机的。只有这些信息,很明显Random.secure()应该一直使用它来确保生成的数字是完全随机的。

但是,由于两种生成数字的方式都存在,我怀疑使用Random(). 这是正确的,在这种情况下这些优势是什么?

标签: dartrandom

解决方案


我做了一些测试,就像人们评论的那样,Random()确实更快。

生成 0 到 100 之间的 100000 个随机整数时,Random()速度快 334 毫秒,获得一个随机数的平均时间为 0.03 毫秒,而Random.secure(). 因此,除非您生成大量数字或您正在执行的任务需要高速,否则这种差异可能无关紧要。

我发现的另一个区别来自文档:

/// If the program cannot provide a cryptographically secure
/// source of random numbers, it throws an [UnsupportedError].

这意味着Random.secure()在某些平台上可能会失败,而Random()不会。因此,除非需要安全号码,否则Random()可能是首选,因为您不必关心错误处理。

这是我为测试速度而编写的代码。for 循环可能会产生一些开销,但由于我正在进行比较,因此不会影响差异。

import 'dart:math';

void main(List<String> arguments) {
  var psuedoRandom = Random();
  var secureRandom = Random.secure();

  var length = 100000;

  var startTime = DateTime.now();
  for (var i = 0; i < length; i++) {
    psuedoRandom.nextInt(100);
  }
  var psuedoDuration = DateTime.now().microsecondsSinceEpoch - startTime.microsecondsSinceEpoch;
  var psuedoAverage = psuedoDuration / length;

  startTime = DateTime.now();
  for (var i = 0; i < length; i++) {
    secureRandom.nextInt(100);
  }
  var secureDuration = DateTime.now().microsecondsSinceEpoch - startTime.microsecondsSinceEpoch;
  var secureAverage = secureDuration / length;

  var psuedoAdvantage = secureDuration - psuedoDuration;

  print('length: $length\n');

  print('psuedo duration: $psuedoDuration');
  print('psuedo average duration: $psuedoAverage\n');

  print('secure duration: $secureDuration');
  print('secure average duration: $secureAverage\n');

  print('Advantage for psuedo: $psuedoAdvantage');
}


推荐阅读