2010-04-04 36 views
6

Tôi đã được giao nhiệm vụ chuyển Java Java.util.Random() sang JavaScript và tôi đã chạy trên một lần truy cập/không chính xác hiệu suất lớn bằng cách sử dụng toán tử bitwise trong Javascript với số lượng đủ lớn. Một số nghiên cứu cho rằng "các toán tử bit trong JavaScript vốn chậm," bởi vì trong nội bộ nó xuất hiện rằng JavaScript sẽ đúc tất cả các giá trị kép của nó thành các số nguyên 32 bit đã ký để thực hiện các thao tác bitwise (see here để biết thêm về điều này). , Tôi không thể thực hiện cổng trực tiếp của trình tạo số ngẫu nhiên Java và tôi cần có cùng kết quả dạng số như Java.util.Random(). Viết cái gì đó nhưHoạt động bitwise 48 bit trong Javascript?

this.next = function(bits) { 
    if (!bits) { 
     bits = 48; 
    } 
    this.seed = (this.seed * 25214903917 + 11) & ((1 << 48) - 1); 
    return this.seed >>> (48 - bits); 
    }; 

(mà là một cảng gần như trực tiếp của Java.util.Random()) mã sẽ không hoạt động đúng, vì Javascript không thể làm hoạt động Bitwise trên một số nguyên kích thước đó.)

tôi đã tìm ra rằng tôi chỉ có thể tạo một bộ tạo số ngẫu nhiên có thể gieo hạt trong không gian 32 bit bằng cách sử dụng thuật toán Lehmer, nhưng mẹo là tôi cần phải có cùng giá trị như với Java.util.Random(). Tôi nên làm gì để tạo cổng nhanh hơn, chức năng hơn?

Trả lời

0

Hoạt động bitwise 48 bit không thể thực hiện được trong JavaScript. Bạn có thể sử dụng hai số để mô phỏng nó mặc dù.

0

Cách khác là sử dụng mảng boolean 48 boolean và tự thực hiện việc di chuyển. Tôi không biết nếu điều này là nhanh hơn, mặc dù; nhưng tôi nghi ngờ nó, vì tất cả các boolean được lưu trữ như tăng gấp đôi.

0

Gấu nhớ rằng một sự thay đổi chút là trực tiếp tương đương với một phép nhân hoặc chia cho một sức mạnh của 2.

1 << x == 1 * Math.pow(2,x) 

Đó là chậm hơn so với chút chuyển dịch, nhưng cho phép bạn mở rộng ra ngoài 32 bit. Nó có thể là giải pháp nhanh hơn cho bits > 32, một khi bạn đưa vào mã bổ sung mà bạn cần hỗ trợ số bit cao hơn, nhưng bạn sẽ phải thực hiện một số hồ sơ để tìm hiểu.

4

Thay vì foo & ((1 << 48) - 1) bạn sẽ có thể sử dụng foo % Math.pow(2,48).

Tất cả các số trong Javascript là các số dấu phẩy động 64 bit, đủ để đại diện cho bất kỳ số nguyên 48 bit nào.

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