2010-01-27 10 views
9

क्या यह संभव है, .NET से, जावा का उपयोग करने वाले सटीक यादृच्छिकरण की नकल करने के लिए? मेरे पास एक बीज है, और मैं एक यादृच्छिक संख्या बनाते समय सी # और जावा दोनों में एक ही परिणाम प्राप्त करने में सक्षम होना चाहता हूं।सी #/जावा नंबर रैंडमलाइजेशन

+0

और यह कितना यादृच्छिक है? ... बस पूछना .. –

+0

@ फिलिप: मुझे लगता है कि यह निहित है कि वह सिर्फ स्टोकास्टिक यादृच्छिकता चाहता है। –

+0

मुझे लगता है कि आप सही हैं। –

उत्तर

5

यदि आपके जावा कार्यान्वयन के लिए java.util.Random कक्षा का स्रोत कोड है, तो आप आसानी से इसे .NET पर पोर्ट कर सकते हैं।

यदि आपको एक निश्चित यादृच्छिक संख्या जनरेटर का उपयोग करने के लिए दोनों अनुप्रयोगों (जावा और .NET) की आवश्यकता होती है, तो आप दोनों प्लेटफ़ॉर्म में बेहतर ढंग से कार्यान्वित करेंगे और इसके बजाय इसका उपयोग करेंगे, क्योंकि सिस्टम प्रदान किया गया संस्करण परिणामस्वरूप अपना व्यवहार बदल सकता है एक अद्यतन का। (ऐसा लगता है कि जावा विनिर्देश ठीक इसके PRNG के व्यवहार का वर्णन है।)

+0

लेकिन एल्गोरिदम एक कार्यान्वयन विस्तार नहीं है और संस्करण/कार्यान्वयन के बीच बदलने की संभावना है ?आईएमओ लगातार परिणाम प्राप्त करने के लिए जावा और सी # दोनों में एक कस्टम एल्गोरिदम लागू करना बेहतर होगा। – dtb

+0

@ डीटीबी: एक ही चीज़ के बारे में सोच रहा था। यदि यह परीक्षण उद्देश्यों के लिए अस्थायी होने जा रहा है, तो यह पर्याप्त होगा। अन्यथा, हाँ, आपको अपना खुद का कार्यान्वयन करना चाहिए। –

+4

@ डीटीबी: एल्गोरिदम जावा के रैंडम क्लास के दस्तावेज में निर्दिष्ट है और इसलिए एक विनिर्देशन है। कार्यान्वयन विवरण बदल सकते हैं लेकिन मुझे अत्यधिक संदेह है कि इसके द्वारा उत्पन्न वास्तविक अनुक्रम भविष्य के संस्करण में होगा। यदि बिलकुल भी, वे एक अलग वर्ग में एक अलग पीआरएनजी जोड़ने की अधिक संभावना रखते हैं। लेकिन वहां जावा के इच्छित दायरे और परिपक्व पुस्तकालयों को देखते हुए वास्तव में छद्म यादृच्छिक संख्या पीढ़ी के लिए अच्छा काम करते हैं, मुझे संदेह है कि वैसे भी होगा। – Joey

0

ठीक है, आप Random.java के लिए स्रोत कोड में देख सकते हैं और एल्गोरिथ्म, स्थिरांक, आदिआदि कॉपी कर सकते हैं, लेकिन रैंडम System.nanoTime का उपयोग करता है इसके कन्स्ट्रक्टर में आपको एक ही परिणाम नहीं मिलेगा।

java.util.Random

सार्वजनिक रैंडम() { से

इस (++ seedUniquifier + System.nanoTime()); }

मुझे आश्चर्य नहीं होगा अगर सी # में स्रोत आपको कुछ समान दिखाएगा।

संपादित करें: जैसा कि इंगित किया गया है, विघटित, निर्माता जो इनपुट बीज लेता है, कभी भी समय तक नहीं पहुंचता है।

+2

वह दोनों के लिए एक ही बीज का उपयोग कर रहा है, इसलिए जावा कार्यान्वयन में डिफ़ॉल्ट बीज अप्रासंगिक है। –

+0

यदि आपके पास बीज नहीं है तो यह केवल इसका उपयोग करता है, वहां 2 कन्स्ट्रक्टर 'रैंडम() 'हैं - कुछ भी नहीं लेता है और' पर्यावरण। टिककाउंट 'और' रैंडम (int32 num) 'का उपयोग करता है जो आपके बीज को टिककंट के बजाय ले जाता है। –

0

शायद यह आपके अपने साधारण छद्म-यादृच्छिक संख्या जनरेटर को लागू करने के लिए समझ में आता है? इस तरह आपके पास पूर्ण नियंत्रण है और उसी बीज को ग्रेनेंट कर सकते हैं, दोनों वातावरण दोनों में समान परिणाम देता है। यद्यपि एक दूसरे को पोर्ट करने की तुलना में शायद थोड़ा और काम।

1

यदि आपको क्रिप्टोग्राफ़िक रूप से सुरक्षित छद्म यादृच्छिक संख्या जनरेटर की आवश्यकता नहीं है तो मैं Mersenne twister के लिए जाऊंगा। आप C# here और Java here के लिए स्रोत कोड पा सकते हैं।

+1

हालांकि सवाल नहीं था। और 'java.util.Random' क्रिप्टोग्राफ़िक रूप से सुरक्षित नहीं है, इसलिए स्पष्ट रूप से एच (is | er) चिंता नहीं है ;-) – Joey

+1

यह सवाल नहीं था, लेकिन * "जावा का सटीक यादृच्छिकरण नकल करने की नकल करें" * मुश्किल लगता है असंभव करने के लिए मैंने ध्यान केंद्रित किया * "मैं इसके परिणामस्वरूप सी # और जावा दोनों में एक ही परिणाम प्राप्त करने में सक्षम होना चाहता हूं" *। –

-2

एक अन्य विकल्प एक मंच से एक बार एक फाइल करने के लिए बाहर अपने यादृच्छिक संख्या लिखने के लिए हो सकता है और उसके बाद सिर्फ इतना है कि फ़ाइल से दोनों प्लेटफार्मों के लिए अपने यादृच्छिक संख्या लोड करते हैं, या आप इस तरह के random.org के रूप में एक सेवा से उन्हें लोड कर सकता है

5

आपको स्रोत कोड पढ़ने की आवश्यकता नहीं है। सूत्र एक एक लाइनर है और documentation for java.util.Random.

में दी गई है यहाँ एक आंशिक अनुवाद है:

[Serializable] 
public class Random 
{ 
    public Random(UInt64 seed) 
    { 
     this.seed = (seed^0x5DEECE66DUL) & ((1UL << 48) - 1); 
    } 

    public int NextInt(int n) 
    { 
     if (n <= 0) throw new ArgumentException("n must be positive"); 

     if ((n & -n) == n) // i.e., n is a power of 2 
      return (int)((n * (long)Next(31)) >> 31); 

     long bits, val; 
     do 
     { 
      bits = Next(31); 
      val = bits % (UInt32) n; 
     } 
     while (bits - val + (n - 1) < 0); 

     return (int) val; 
    } 

    protected UInt32 Next(int bits) 
    { 
     seed = (seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1); 

     return (UInt32)(seed >> (48 - bits)); 
    } 

    private UInt64 seed; 
} 

उदाहरण: दोनों प्लेटफ़ॉर्म पर

Random rnd = new Random(42); 
Console.WriteLine(rnd.NextInt(10)); 
Console.WriteLine(rnd.NextInt(20)); 
Console.WriteLine(rnd.NextInt(30)); 
Console.WriteLine(rnd.NextInt(40)); 
Console.WriteLine(rnd.NextInt(50)); 

आउटपुट 0, 3, 18, 4, 20 है।

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