2010-09-14 28 views
15

मैं बिगइंटर वर्ग का उपयोग कर जावा में एक यादृच्छिक एन अंक पूर्णांक उत्पन्न करने के बारे में अनिश्चित हूं।बिगइंटर श्रेणी का उपयोग कर जावा में एक यादृच्छिक एन अंक पूर्णांक कैसे उत्पन्न करूं?

+0

एचएम ... सबसे अच्छा तरीका इसे पूरी तरह से यादृच्छिक 32-बिट या 64-बिट संख्याओं से बाहर बनाना है। निश्चित नहीं है कि एपीआई इसे अनुमति देता है। –

+0

एमएमएम ... मैंने कभी ऐसा नहीं किया है, लेकिन मेरा मानना ​​है कि सीनेज़र ने मेरा से बेहतर समाधान दिया है। आपको इसके बजाय अपना जवाब स्वीकार करना चाहिए। मुझे लगता है कि जब आप "5000 अंकों की संख्या" कहते हैं, तो आपका मतलब है कि पहला अंक 0 नहीं है, और मेरा उत्तर इसका पालन नहीं करता है। –

उत्तर

11
private static Random rnd = new Random(); 

public static String getRandomNumber(int digCount) { 
    StringBuilder sb = new StringBuilder(digCount); 
    for(int i=0; i < digCount; i++) 
     sb.append((char)('0' + rnd.nextInt(10))); 
    return sb.toString(); 
} 

और फिर आप इसका इस्तेमाल कर सकते हैं:

new BigInteger(getRandomNumber(10000)) 
+0

बुरा नहीं है, आपको पहले अंक के लिए एक विशेष मामला चाहिए, हालांकि –

+0

@seanizer: यदि हम 1x..x - 9..9 पर एक समान वितरण चाहते हैं तो आप सही हैं। मैंने पूरी श्रृंखला पर एक समान वितरण माना। वैसे भी आपके उत्तर पर +1 :) –

+0

किसी कारण से मुझे कभी-कभी 18 –

3

सबसे आसान तरीका संभवतः एक char [] सरणी को 5000 यादृच्छिक अंकों के साथ भरना होगा, इसे एक स्ट्रिंग में परिवर्तित करें, और फिर BigInteger(String) कन्स्ट्रक्टर को कॉल करें।

यदि इनमें से कोई भी कदम आपको समस्याएं देता है, तो कृपया अधिक जानकारी दें।

वैकल्पिक रूप से, आप कुछ इस तरह कर सकता है:

Random rng = new Random(); // But use one instance throughout your app 
BigInteger current = BigInteger.ZERO; 
for (int i = 0; i < 5000; i++) { 
    BigInteger nextDigit = BigInteger.valueOf(rng.nextInt(10)); 
    current = current.multiply(BigInteger.TEN).add(nextDigit); 
} 

मुझे लगता है कि हालांकि बल्कि कम कुशल हो जाएगा।

आप rng.nextInt(1000000000) के साथ एक समय में नौ यादृच्छिक अंक उत्पन्न करके आवश्यक चरणों की संख्या को कम कर सकते हैं।

+1

ध्यान दें कि इससे आपको 1 और 10^5000 के बीच एक यादृच्छिक वितरण मिलेगा, इसलिए इसके द्वारा उत्पादित कुछ संख्या 5000 अंकों लंबी नहीं होगी। यदि सभी 5000 अंकों के बीच एक समान वितरण की आवश्यकता है, तो पहला अंक rng.nextInt (9) +1 द्वारा चुने गए विशेष मामले में किया जाना चाहिए। – oksayt

+1

@oksayt: हाँ, मैंने लगभग उल्लेख किया है कि ... तो इतना चुनिंदा नहीं होने का फैसला किया;) –

+0

int i; char [] num = new char [5000]; यादृच्छिक आर = नया यादृच्छिक(); (i = 0; i <5000; i ++) { int j = R.nextInt (10) + 1; num [i] = (char) j; } स्ट्रिंग एस = संख्या।तार(); बिगइंटर एन = नया बिगइंटर (ओं); – makaveli2178

0

उस में 5000 अंकों के साथ एक स्ट्रिंग ले लो तो यह BigInteger में तब्दील।

5

डॉक्स के अनुसार, वहाँ क्या आप जावा 6 में चाहते करने के लिए एक निर्माता है: BigInteger(int, java.util.Random)

कि करने के लिए

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

+0

यह * अंकों * के बजाए कई * बिट्स * देता है, जो कम से कम * थोड़ा * स्पष्ट रूप से बना देगा यदि ओपी 5000 अंकों की संख्या से यादृच्छिक वितरण चाहता है .. मूल रूप से एक यादृच्छिक मान उत्पन्न करता है जो बहुत बड़ा हो सकता है, और फिर एक उचित व्यक्ति के साथ आता है जब दोहराना। –

+0

@ जोन: संपादित देखें; यदि ओप अपने प्रश्न के लिए "आकार" का अर्थ लचीला है, तो 5000 बिट्स (एक ऐसा) 5000 अंकों जितना अच्छा हो सकता है। इसके अलावा, मेरा फोन सवालों के जवाब देने के लिए बेकार है। – Carl

+0

हां, मुझे अंकों को बिट्स नहीं चाहिए। मैंने आपके द्वारा वर्णित उस कन्स्ट्रक्टर का उपयोग किया और फिर बाद में महसूस किया कि यह केवल 0 और 2^numbits - 1 के बीच एक संख्या देता है, 5000 डिजिटल पूर्णांक – makaveli2178

2

यहाँ दो संस्करण हैं, एक पैरामीटर के रूप में एक यादृच्छिक लेता है (मामले में आप इसे फिर से उपयोग करना चाहते हैं):

public static BigInteger getRandomNumber(final int digCount){ 
    return getRandomNumber(digCount, new Random()); 
} 

public static BigInteger getRandomNumber(final int digCount, Random rnd){ 
    final char[] ch = new char[digCount]; 
    for(int i = 0; i < digCount; i++){ 
     ch[i] = 
      (char) ('0' + (i == 0 ? rnd.nextInt(9) + 1 : rnd.nextInt(10))); 
    } 
    return new BigInteger(new String(ch)); 
} 

जिसके परिणामस्वरूप BigInteger हमेशा निर्दिष्ट लंबाई होगा।

1

यदि n 12 के लिए 1 के बीच उसके बाद निम्न विधि

private String getRandom(int length) { 
    if (length < 1 && length > 12) { 
     throw new IllegalArgumentException("Random number generator length should be between 1 to 12"); 
    } 
    long nextLong = Math.abs(random.nextLong()); 
    return String.valueOf(nextLong).substring(0, length); 
} 

एक और बात नोट करने के लिए मदद करता है कि यह अच्छी तरह से कोड का परीक्षण नहीं किया जाता है।