2013-04-26 57 views

Trả lời

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"); 
} 

Output (giao diện điều khiển ứng dụng):

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:9776937558322317 
Part 6: 2409230726 
Combined: 26825630019660005909515912993248305589473794217828668028446551175558 
Part 7: 3743170719 
... 

EDIT

Như Darshan Computing chỉ ra trong các ý kiến, để làm công việc này với dart2js, một số sửa đổi là cần thiết, và điều này sẽ dẫn đến mất độ chính xác. Để sử dụng tính năng này với trình duyệt, bạn cần có thư viện bên ngoài và js interop. Như một ví dụ, tôi sử dụng public domain BigInt library

tập tin HTML Leemon Baird:

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

Dart file:

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)); 
} 
+0

Tôi hy vọng điều gì đó ít rõ ràng hơn, nhưng cảm ơn bạn đã trả lời anw. – gmosx

+1

Nó thực sự cần lưu ý rằng điều này chỉ hoạt động trong máy ảo Dart. OP không xác định liệu có hỗ trợ trình duyệt hay không; nó cũng có thể được. –

+0

@DarshanĐánh giá điểm tốt. nó có thể (nếu trình duyệt tự hỗ trợ nó), nhưng bạn phải làm việc xung quanh dart2js một chút. chỉnh sửa câu trả lời. – MarioP

3

Nhờ nhận xét bên dưới, tôi thấy rằng tùy thuộc vào môi trường thực thi, bạn int class có thể có kích thước tùy ý hoặc bị giới hạn ở 53 bit.

Trong trường hợp trước đây, bạn có thể chỉ cần tạo một giá trị ngẫu nhiên từ nhiều đoạn mã bằng cách sử dụng toán tử shift. Vì nextInt không hỗ trợ tối đa 2 - 1 (đối số max của nó cho phép giá trị đó, nhưng nó là độc quyền, vì vậy bạn nhận được một giá trị ít hơn), bạn có thể muốn thực hiện điều này theo khối 16 bit . Bắt đầu bằng không và mỗi bước dịch chuyển giá trị hiện tại còn 16 bit trước khi thêm một số nguyên 16 bit khác (tức là một số nguyên với 2 làm đối số max). Sau 16 lần lặp, bạn sẽ tích lũy 256 bit.

Khi được biên dịch sang JavaScript, int chỉ có 53 bit quan trọng. Trong trường hợp đó, bạn sẽ phải thực hiện kích thước số nguyên tùy ý, hoặc sử dụng một số thư viện của bên thứ ba hoặc tự viết, có lẽ dựa trên ý tưởng từ http://en.wikipedia.org/wiki/Arbitrary-precision_arithmetic. Một khi bạn có một lớp số nguyên lớn, việc tạo ra một phần tử ngẫu nhiên nên dễ dàng, vì hầu hết các biểu diễn bên trong của các số nguyên lớn sẽ bao gồm 16 hoặc 32 bit đơn vị trong mọi trường hợp.

+2

có: đó là 'int' – MarioP

+0

@MarioP Chắc chắn, trong Dart VM. –

+0

@MarioP: cảm ơn rất nhiều, tôi đã bỏ lỡ chi tiết đó. Điều chỉnh câu trả lời của tôi cho phù hợp. – MvG

Các vấn đề liên quan