6

我想在 Dart 中创建一个随机(均匀分布的)256 位整数。Dart 的 Random 仅支持 32 位整数。有任何想法吗?

4

2 回答 2

7
import "dart:math";

// 16bit, because random.nextInt() only supports (2^32)-1 possible values.
const PARTS = 16;  // 256bit / 16bit

void main() {
  Random rand = new Random();
  int combinedVal = 0;
  // random parts
  for(var i=0;i<PARTS;i++) {
    int part = rand.nextInt(1<<16); // 2^16
    print("Part $i: $part");
    // shift the 16bit blocks to the left and append the new block
    combinedVal <<= 16;
    combinedVal += part;
    print("Combined: $combinedVal");
  }
  print("Final Result: $combinedVal");
}

输出(控制台应用程序):

Part 0: 4273569419
Combined: 4273569419
Part 1: 2298770505
Combined: 18354840894089491529
Part 2: 1076269765
Combined: 78833441363397765815400305349
Part 3: 500743884
Combined: 338587052486927055616611084622869610188
Part 4: 1660193956
Combined: 1454220317280387171410917722806313469431388605604
Part 5: 1335995533
Combined: 6245828703898006563427837796799909693532109776937558322317
Part 6: 2409230726
Combined: 26825630019660005909515912993248305589473794217828668028446551175558
Part 7: 3743170719
...

编辑

正如 Darshan Computing 在评论中指出的那样,要使用 dart2js 进行这项工作,需要进行一些修改,这会导致精度下降。要在浏览器中使用它,需要一个外部库和js 互操作。例如,我使用了 Leemon Baird 的公共域 BigInt 库

HTML 文件:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Web Playground</title>
    <link rel="stylesheet" href="web_playground.css">
    <script src="BigInt.js"></script> <!-- this is the important part -->
  </head>
  <body>
    <h1>Web Playground</h1>
    <script type="application/dart" src="web_playground.dart"></script>
    <script src="packages/browser/dart.js"></script>
  </body>
</html>

飞镖文件:

import "dart:html";
import "package:js/js.dart" as js;

void main() {
  var rand = js.context.randBigInt(256,0);
  window.alert(js.context.bigInt2str(rand,10));
}
于 2013-04-26T08:49:36.290 回答
3

感谢下面的评论,我发现根据执行环境,你的int可能是任意大小或限制为 53 位。

在前一种情况下,您可以使用移位运算符从多个片段中简单地构造一个随机值。由于nextInt不支持 2 32 - 1 的包含最大值(它的max参数允许该值,但它是独占的,因此您得到的可能值较少),您可能希望以 16 位块的形式执行此操作。从零开始,在每一步中将当前值左移 16 位,然后再添加另一个 16 位整数(即一个以 2 16作为max参数的整数)。16 次迭代后,您将累积 256 位。

编译为 JavaScript 时,int只有 53 个有效位。在这种情况下,您必须有一个任意大小的整数实现,或者使用一些第三方库或自己编写,可能基于http://en.wikipedia.org/wiki/Arbitrary-precision_arithmetic的想法。一旦你有了一个大整数类,生成一个随机元素应该很容易,因为在任何情况下,大整数的内部表示很可能由 16 位或 32 位单元组成。

于 2013-04-26T08:38:58.267 回答