Dart 有两种不同的方式生成随机数。Random()和Random.secure(),其中前者是伪随机的。仅凭此信息,显然Random.secure()应该始终使用该信息来确保生成的数字完全随机。
然而,由于存在两种生成数字的方法,我怀疑使用Random(). 这是正确的吗?在这种情况下,这些优势是什么?
我做了一些测试,正如人们评论的那样,Random()确实更快。
当生成 100000 个 0 到 100 之间的随机整数时,Random()速度快了 334 毫秒,获得一个随机数的平均时间为 0.03 毫秒,而Random.secure(). 因此,除非您生成大量数字或者您正在执行的任务需要高速,否则这种差异可能并不重要。
我发现的另一个区别来自文档:
/// If the program cannot provide a cryptographically secure
/// source of random numbers, it throws an [UnsupportedError].
Run Code Online (Sandbox Code Playgroud)
这意味着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');
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1041 次 |
| 最近记录: |