2009-07-23 45 views
8

Khi sử dụng (giả) số ngẫu nhiên trong Jython, sẽ hiệu quả hơn khi sử dụng mô-đun ngẫu nhiên Python hoặc lớp ngẫu nhiên của Java?Ngẫu nhiên trong Jython

+3

Vui lòng xây dựng những gì bạn cho là "hiệu quả". –

+2

Bạn đã thử đo thời gian cần thiết cho mỗi? –

Trả lời

9

phiên bản Python là nhanh hơn nhiều trong một thử nghiệm đơn giản trên máy Mac của tôi:

jython -m timeit -s "import random" "random.random()" 

1000000 vòng, tốt nhất là 3: 0,266 USEC mỗi vòng lặp

vs

jython -m timeit -s "import java.util.Random; random=java.util.Random()" "random.nextDouble()" 

1000000 vòng, tốt nhất là 3: 1.65 usec mỗi vòng lặp

Phiên bản Jython 2.5b3 và phiên bản Java 1.5.0_19.

+1

thời gian, eh? Tôi phải nhớ điều đó !! +1 – richq

+0

timeit là một trong những thứ có chứa trăn 'pin'. Không hoàn toàn cần thiết nhưng rất tốt đẹp để có. –

4

Sử dụng lớp ngẫu nhiên của Java (và thực sự phải sử dụng thông số kỹ thuật của Java) một thuật toán đồng đẳng tuyến tính, trong khi Python sử dụng Mersenne Twister. Mersenne đảm bảo chất lượng cực kỳ cao (mặc dù không phải là crypto chất lượng!) Số ngẫu nhiên và khoảng thời gian dài vô cùng (nổi chính xác 53 bit, giai đoạn 2 ** 19937-1); máy phát điện đồng tuyến tuyến tính đã nổi tiếng issues. Nếu bạn không thực sự quan tâm đến chất lượng của các số ngẫu nhiên, và chỉ quan tâm đến tốc độ, LCG có thể nhanh hơn chính xác vì nó ít phức tạp hơn.

+1

Trên thực tế, theo một số tiêu chuẩn cũ tôi đã làm trong ngôn ngữ lập trình D, Mersenne Twister nhanh hơn, mặc dù nó sử dụng nhiều bộ nhớ hơn. Điều này là do các twister Mersenne tránh op phân chia mà nhu cầu đồng dư tuyến tính. Về lý do duy nhất để sử dụng congruential tuyến tính là nếu bạn có những hạn chế về bộ nhớ cực đoan hoặc nếu bạn chỉ cần một vài số ngẫu nhiên và thời gian cần để hạt giống máy phát điện là một nút cổ chai. (Congruential tuyến tính có một không gian nhà nước nhỏ hơn để hạt giống là nhanh hơn.) – dsimcha

+0

LCGs cần một bộ phận? Hầu hết các LCG được sử dụng ở đâu đó sử dụng sức mạnh của hai mô đun của chúng (làm cho việc tìm kiếm các thông số phù hợp khó hơn nhưng nhanh hơn đáng kể). – Joey

+2

Java chỉ định một mô-đun chính xác (2 ** 48) -1 và tất cả các thực thi chuẩn Java PHẢI sử dụng chính xác điều đó, vì vậy tôi không thấy "hầu hết các LCG được sử dụng ở đâu đó" phải làm gì với trường hợp - java .Random có ​​những quy tắc rất chính xác. –