2013-04-26 9 views

Odpowiedz

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

wyjściowa (Aplikacja konsoli):

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

Jak Darshan Computing zauważył w komentarzach, aby to działało z dart2js, potrzebne są pewne zmiany, a to spowodowałoby utratę precyzji. Aby użyć tej opcji w przeglądarce, potrzebna byłaby biblioteka zewnętrzna i js interop. Jako przykład, użyłem Leemon Bairda public domain BigInt library

plik HTML: Plik

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

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

Miałem nadzieję na coś mniej wyraźnego, ale dziękuję za odpowiedź. – gmosx

+1

Należy zauważyć, że działa to tylko w maszynie Dart VM. OP nie określił, czy potrzebne było wsparcie dla przeglądarki; może tak być. –

+0

@DarshanComputing dobry punkt. jest to możliwe (jeśli sama przeglądarka go obsługuje), ale musisz trochę popracować nad dart2js. edycja odpowiedzi. – MarioP

3

Dzięki poniższym komentarzom stwierdziłem, że w zależności od środowiska wykonawczego, użytkownik int class może mieć dowolny rozmiar lub ograniczony do 53 bitów.

W pierwszym przypadku można po prostu skonstruować losową wartość z wielu fragmentów za pomocą operatorów zmian. Ponieważ nextInt nie obsługuje maksimum 2 - 1 (jego argument max zezwala na tę wartość, ale jest to exclusive, więc otrzymasz jedną mniejszą wartość posisble), możesz to zrobić w porcjach 16 bitów . Zacznij od zera iw każdym kroku przesuń aktualną wartość pozostawioną przez 16 bitów przed dodaniem kolejnej 16-bitowej liczby całkowitej (to znaczy jednej z 2 jako argumentem max). Po 16 iteracjach zgromadzisz 256 bitów.

Po skompilowaniu do JavaScript, int ma tylko 53 znaczące bity. W takim przypadku musisz mieć dowolną implementację liczby całkowitej, używając biblioteki innej firmy lub samodzielnie, być może w oparciu o pomysły z http://en.wikipedia.org/wiki/Arbitrary-precision_arithmetic. Gdy masz dużą klasę całkowitą, generowanie losowego elementu powinno być łatwe, ponieważ najprawdopodobniej wewnętrzna reprezentacja dużych liczb całkowitych będzie składała się w każdym razie z 16 lub 32 bitowych jednostek.

+2

istnieje: to 'int' – MarioP

+0

@MarioP pewno w Dart VM. –

+0

@MarioP: wielkie dzięki, tęskniłem za tym szczegółem. Poprawiłem odpowiedź odpowiednio. – MvG

Powiązane problemy