2013-06-28 8 views
15

मुझे कुछ यादृच्छिक बूलियन उत्पन्न करने की आवश्यकता है। हालांकि मुझे true लौटने की संभावना निर्दिष्ट करने में सक्षम होना चाहिए। परिणामस्वरूप:वजन या पूर्वाग्रह के साथ यादृच्छिक बूलियन

private Random random = new Random(); 
random.nextBoolean(); 

काम नहीं करेगा।

एक संभव समाधान होगा:

private Random random = new Random() 

public boolean getRandomBoolean(float p){ 
return random.nextFloat() < p; 
} 

मैं अगर वहाँ ऐसा करने का एक बेहतर या अधिक प्राकृतिक तरीका है सोच रहा था।

संपादित करें: मुझे लगता है कि मैं पूछ रहा हूं कि पुस्तकालय वर्ग है जो अगली बुलीयन (फ्लोट संभावना) विधि प्रदान करती है।

+3

क्या की "बेहतर" आप देख रहे हैं प्रकार? यह मुझे उचित लगता है ... –

+1

ये दो (अनिवार्य रूप से) अलग-अलग समस्याएं हैं, इसलिए दो अलग-अलग पदों में पूछा जाना चाहिए ... –

+0

@ जोनस्केट मुझे लगता है कि मैं Random.nextBoolean (लंबी संभावना) के साथ कुछ की उम्मीद कर रहा था। – maxf130

उत्तर

9

मैं सोच रहा था कि ऐसा करने का बेहतर या अधिक प्राकृतिक तरीका है या नहीं।

जिस दृष्टिकोण का आप उपयोग कर रहे हैं वह ठीक है। * AFAIK, मानक जावा विधि नहीं है जो इस कोड को कम करेगी।


* गैर क्रिप्टोग्राफिक प्रयोजनों के लिए।

+2

क्या यह कोई टिप्पणी नहीं है ?? –

+0

@ बादाशाः हम्म, हाँ। मैंने अभी जवाब दिया है! –

+0

हाँ .. प्रभाव !!!! +1। –

4

1) हाँ, मुझे लगता है कि आपका दृष्टिकोण मान्य है और मुझे एक और आसान तरीका नहीं दिख रहा है।

2) विभिन्न सांख्यिकीय वितरण के यादृच्छिक संख्या निपटने के लिए एक पुस्तकालय है:

http://introcs.cs.princeton.edu/java/22library/StdRandom.java.html

+0

धन्यवाद, मैं वास्तव में क्या देख रहा था :) – maxf130

-1

आपका तरीका शायद बेहतर है, कोड गोल्फ के लिहाज से, लेकिन एक और तरीका यह करने के लिए इस तरह है:

public boolean getRandomBoolean() { 
    Random random = new Random(); 
    //For 1 in 5 
    int chanceOfTrue = 5; 

    if (random.nextInt(chanceOfTrue) == 0) { 
     return true; 
    } else { 
     return false; 
    } 
} 

या 5 में 2 के लिए, इस प्रयास करें:

public boolean getRandomBoolean() { 
    Random random = new Random(); 
    //For 2 in 5 
    int chanceOfTrue = 5; 
    int randInt = random.nextInt(chanceOfTrue); 

    if (randInt == 0 || randInt == 1) { 
     return true; 
    } else { 
     return false; 
    } 
} 
-1

यादृच्छिक वस्तु को पहले से ही इंटिलाइज किया जाना चाहिए।

public static boolean flipRandom(double probability) { 
    Validate.isBetween(probability, 0, 1, true); 
    if(probability == 0) 
     return false; 
    if(probability == 1) 
     return true; 
    if(probability == 0.5) 
     return random.nextBoolean(); 
    return random.nextDouble() < probability ? true : false; 
} 
+0

सत्यापन उचित है, बाकी कोड को अनावश्यक रूप से कम पठनीय बनाता है। इसे सरल रखें – Oneiros

0
public boolean getBiasedRandom(int bias) { 
     int c; 
     Random t = new Random(); 
    // random integers in [0, 100] 
     c=t.nextInt(100); 
     if (c>bias){return false; 
     } 
     else{return true;} 
     } 

यह एक प्रतिशत के आधार पर किया जाता है ...

0

यहाँ मैं क्या उपयोग कर रहा हूँ है। फ्रैक्चरर्ड रेटिना के जवाब के समान ही।

Random random = new Random(); 

// 20% chance 
boolean true20 = (random.nextInt(5) == 0) ? true : false; 

// 25% chance 
boolean true25 = (random.nextInt(4) == 0) ? true : false; 

// 40% chance 
boolean true40 = (random.nextInt(5) < 2) ? true : false; 
+1

टर्नरी ऑपरेटर पूरी तरह से अनावश्यक है। क्यों न सिर्फ 'बूलियन true20 = (random.nextInt (5) == 0) '? – Oneiros

+0

आप जानते हैं कि जब आप एक नई बात सीखते हैं, तो यह हर स्थिति में उपयोगी होता है? मैं पूरी तरह से सहमत हूं कि यह अनावश्यक है। – bobanahalf

0

user2495765 का जवाब, आप एक समारोह जो एक इनपुट अनुपात लेता कर सकते हैं पर विस्तार (के रूप में दो मानों संभावना: सीमा देखते कोड)

public class MyRandomFuncs { 
    public Random rand = new Random(); 

    boolean getBooleanAsRatio(int chance, int range) { 
     int c = rand.nextInt(range + 1); 
     return c > chance; 
    } 

}

आप क्या करना चाहते हैं पर निर्भर करता है ऐसा करने के लिए, आप शायद अपनी विधि के भीतर से यादृच्छिक रूप से इनलाइन करना नहीं चाहते हैं बल्कि क्लास वैरिएबल (उपरोक्त कोड में) के रूप में उपयोग करें और अपने फ़ंक्शन के भीतर से nextInt() को कॉल करें।

0

MockNeat लाइब्रेरी इस सुविधा को लागू करता है।एक बूलियन मान सच होने का 99.99% है कि पैदा करने के लिए

उदाहरण:

MockNeat m = MockNeat.threadLocal(); 
boolean almostAlwaysTrue = m.bools().probability(99.99).val(); 
संबंधित मुद्दे