मैं पूर्णांक सरणी से यादृच्छिक रूप से नंबर लेने के लिए समाधान ढूंढ रहा हूं।
उदाहरण के लिए मेरे पास एक सरणी है new int[]{1,2,3}, मैं किसी संख्या को यादृच्छिक रूप से कैसे चुन सकता हूं?
जवाबों:
public static int getRandom(int[] array) {
int rnd = new Random().nextInt(array.length);
return array[rnd];
}
generatorइसका उदाहरण हैjava.util.Random
Random()जब आप फ़ंक्शन चलाते हैं तो मैं हर बार नहीं बनाऊंगा : यादृच्छिक जनरेटर का इतिहास होना चाहिए। यदि ऐसा नहीं है, तो यह बेहद अनुमानित है। यह इस मामले में बिल्कुल भी समस्या नहीं है - लेकिन यह उल्लेख किया जाना चाहिए कि array[(int)(System.currentTimeMillis() % array.length)]प्रस्तावित समाधान जितना ही अच्छा है।
new Random()एक ऐसे उदाहरण को बनाने की कोशिश करता है जिसमें पहले से निर्मित किसी बीज की तुलना में अलग बीज हो Random। कम समय में दो बार फ़ंक्शन को लागू करने से आपका दृष्टिकोण बुरी तरह टूट जाएगा।
gcd(array.length,clockAccuracy)!=1
रैंडम इंडेक्स जेनरेट करने के लिए आप उस इंडेक्स पर रैंडम जेनरेटर का इस्तेमाल कर सकते हैं।
//initialization
Random generator = new Random();
int randomIndex = generator.nextInt(myArray.length);
return myArray[randomIndex];
यदि आप कई बार एक यादृच्छिक तत्व प्राप्त करने जा रहे हैं, तो आप यह सुनिश्चित करना चाहते हैं कि आपका यादृच्छिक संख्या जनरेटर केवल एक बार आरंभीकृत हो।
import java.util.Random;
public class RandArray {
private int[] items = new int[]{1,2,3};
private Random rand = new Random();
public int getRandArrayElement(){
return items[rand.nextInt(items.length)];
}
}
यदि आप यादृच्छिक सरणी तत्वों को उठा रहे हैं, तो अप्रत्याशित होने की आवश्यकता है, आपको यादृच्छिक के बजाय java.security.SecureRandom का उपयोग करना चाहिए । यह सुनिश्चित करता है कि अगर किसी को पिछले कुछ पिक्स पता हैं, तो उन्हें अगले एक अनुमान लगाने में कोई फायदा नहीं होगा।
यदि आप जेनरिक का उपयोग करके ऑब्जेक्ट सरणी से एक यादृच्छिक संख्या चुन रहे हैं, तो आप ऐसा करने के लिए एक विधि परिभाषित कर सकते हैं (स्रोत स्ट्रिंग में रैंडम तत्व में अविनाश आर ):
import java.util.Random;
public class RandArray {
private static Random rand = new Random();
private static <T> T randomFrom(T... items) {
return items[rand.nextInt(items.length)];
}
}
आप भी उपयोग कर सकते हैं
public static int getRandom(int[] array) {
int rnd = (int)(Math.random()*array.length);
return array[rnd];
}
Math.random()एक रिटर्न doubleके बीच 0.0करने के लिए (सम्मिलित) 1.0(अनन्य)
के साथ इस गुणा array.lengthआप एक देता है doubleके बीच 0.0(सम्मिलित) और array.length(अनन्य)
(समावेशी) और (समावेशी) के intबीच पूर्ण और आपको पूर्णांक देने के लिए कास्टिंग0array.length-1
चूंकि आपके पास java 8 है, इसलिए एक और उपाय स्ट्रीम एपीआई का उपयोग करना है।
new Random().ints(1, 500).limit(500).forEach(p -> System.out.println(list[p]));
1सबसे कम अंतर उत्पन्न (समावेशी) कहां है और 500उच्चतम (अनन्य) है। limitइसका मतलब है कि आपकी स्ट्रीम की लंबाई 500 होगी।
int[] list = new int[] {1,2,3,4,5,6};
new Random().ints(0, list.length).limit(10).forEach(p -> System.out.println(list[p]));
रैंडम java.utilपैकेज से है।
इस प्रश्न पर एक नज़र डालें:
मैं जावा में एक विशिष्ट सीमा के भीतर यादृच्छिक पूर्णांक कैसे उत्पन्न करूं?
आप अपनी पूर्णांक लंबाई से 0 से एक यादृच्छिक संख्या उत्पन्न करना चाहते हैं - 1. तो बस अपने सरणी से अपने int प्राप्त करें:
myArray[myRandomNumber];
package workouts;
import java.util.Random;
/**
*
* @author Muthu
*/
public class RandomGenerator {
public static void main(String[] args) {
for(int i=0;i<5;i++){
rndFunc();
}
}
public static void rndFunc(){
int[]a= new int[]{1,2,3};
Random rnd= new Random();
System.out.println(a[rnd.nextInt(a.length)]);
}
}
आप भी इस तरीके को आजमा सकते हैं।
public static <E> E[] pickRandom_(int n,E ...item) {
List<E> copy = Arrays.asList(item);
Collections.shuffle(copy);
if (copy.size() > n) {
return (E[]) copy.subList(0, n).toArray();
} else {
return (E[]) copy.toArray();
}
}
O(nlogn)समय जटिलता के साथ एक सूची में फेरबदल करते हैं, कुल सरणी के रूप में 3 बार की कुल मेमोरी का उपयोग करके इसकी प्रतिलिपि दो बार बनाते हैं, भले ही ओपी के बारे में पूछे गए समस्या को O(1)समय की जटिलता और O(1)स्मृति के साथ हल किया जा सके ...?
package io.github.baijifeilong.tmp;
import java.util.concurrent.ThreadLocalRandom;
import java.util.stream.Stream;
/**
* Created by BaiJiFeiLong@gmail.com at 2019/1/3 下午7:34
*/
public class Bar {
public static void main(String[] args) {
Stream.generate(() -> null).limit(10).forEach($ -> {
System.out.println(new String[]{"hello", "world"}[ThreadLocalRandom.current().nextInt(2)]);
});
}
}