2010-04-04 16 views
6

मुझे जावास्क्रिप्ट में जावा के Java.util.Random() को पोर्ट करने का कार्य दिया गया है, और मैंने पर्याप्त रूप से बड़ी संख्या में जावास्क्रिप्ट में बिटवाई ऑपरेटरों का उपयोग करके एक विशाल प्रदर्शन हिट/गलतता में भाग लिया है। कुछ कर्सर शोध में कहा गया है कि "जावास्क्रिप्ट में बिटवाई ऑपरेटर स्वाभाविक रूप से धीमे होते हैं," क्योंकि आंतरिक रूप से ऐसा प्रतीत होता है कि जावास्क्रिप्ट इसके सभी डबल मानों को बिटवाई ऑपरेशंस (see here) पर अधिक के लिए हस्ताक्षरित 32-बिट पूर्णांक में डालेगा।) इसके कारण , मैं जावा यादृच्छिक संख्या जेनरेटर का सीधा बंदरगाह नहीं कर सकता, और मुझे Java.util.Random() के समान संख्यात्मक परिणाम प्राप्त करने की आवश्यकता है। जैसे48-बिट बिटवाई ऑपरेशंस?

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

कुछ लेखन कोड (जो Java.util.Random() की एक लगभग प्रत्यक्ष बंदरगाह है) ठीक से काम नहीं करेंगे, क्योंकि जावास्क्रिप्ट है कि आकार एक पूर्णांक पर बिटवाइज़ संचालन नहीं कर सकते।)

मैं मैंने यह पता लगाया है कि मैं लेहमेर एल्गोरिदम का उपयोग करके 32-बिट स्पेस में केवल एक बीज योग्य यादृच्छिक संख्या जेनरेटर बना सकता हूं, लेकिन चाल यह है कि मुझे Java.util.Random() के साथ वही मान प्राप्त करने की आवश्यकता है। तेज, कार्यात्मक बंदरगाह बनाने के लिए मुझे क्या करना चाहिए?

उत्तर

0

जावास्क्रिप्ट में 48-बिट बिटवाई ऑपरेशंस संभव नहीं हैं। हालांकि आप इसे अनुकरण करने के लिए दो संख्याओं का उपयोग कर सकते हैं।

0

एक विकल्प 48 बूलियन के बूलियन सरणी का उपयोग करना है, और स्वयं को स्थानांतरित करना लागू करना है। मुझे नहीं पता कि यह तेज है, हालांकि; लेकिन मुझे शक है, क्योंकि सभी बूलियन युगल के रूप में संग्रहीत हैं।

0

ध्यान रखें कि एक सा बदलाव के 2.

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

यह बिट स्थानांतरण की तुलना में धीमी है एक शक्ति से सीधे एक गुणा या विभाजन के बराबर है, लेकिन आप 32 बिट से बाहर भी करने की अनुमति देता में भालू। यह bits > 32 के लिए एक तेज़ समाधान हो सकता है, एक बार जब आप अतिरिक्त कोड में कारक बनाते हैं तो आपको उच्च बिट गिनती का समर्थन करने की आवश्यकता होती है, लेकिन आपको पता लगाने के लिए कुछ प्रोफाइलिंग करना होगा।

4

foo & ((1 << 48) - 1) के बजाय आपको foo % Math.pow(2,48) का उपयोग करने में सक्षम होना चाहिए।

जावास्क्रिप्ट में सभी संख्या 64-बिट फ़्लोटिंग पॉइंट संख्याएं हैं, जो 48-बिट पूर्णांक का प्रतिनिधित्व करने के लिए पर्याप्त हैं।

संबंधित मुद्दे