किसी ऐरे से तत्व को बेतरतीब ढंग से कैसे चुनें


94

मैं पूर्णांक सरणी से यादृच्छिक रूप से नंबर लेने के लिए समाधान ढूंढ रहा हूं।

उदाहरण के लिए मेरे पास एक सरणी है new int[]{1,2,3}, मैं किसी संख्या को यादृच्छिक रूप से कैसे चुन सकता हूं?


जवाबों:


182
public static int getRandom(int[] array) {
    int rnd = new Random().nextInt(array.length);
    return array[rnd];
}

2
हां, लेकिन आपको बताना है कि generatorइसका उदाहरण हैjava.util.Random
stivlo

25
Random()जब आप फ़ंक्शन चलाते हैं तो मैं हर बार नहीं बनाऊंगा : यादृच्छिक जनरेटर का इतिहास होना चाहिए। यदि ऐसा नहीं है, तो यह बेहद अनुमानित है। यह इस मामले में बिल्कुल भी समस्या नहीं है - लेकिन यह उल्लेख किया जाना चाहिए कि array[(int)(System.currentTimeMillis() % array.length)]प्रस्तावित समाधान जितना ही अच्छा है।
अल्फ

5
@alf, कि प्रस्तावित समाधान से जितना दूर है उतना ही अच्छा है। new Random()एक ऐसे उदाहरण को बनाने की कोशिश करता है जिसमें पहले से निर्मित किसी बीज की तुलना में अलग बीज हो Random। कम समय में दो बार फ़ंक्शन को लागू करने से आपका दृष्टिकोण बुरी तरह टूट जाएगा।
एनियोबे

1
@ कुछ सिस्टमों में मिली-सेकंड सटीक घड़ी नहीं होती है, जो कुछ विकल्पों को छोड़ सकती है, अगरgcd(array.length,clockAccuracy)!=1
शाफ़्ट

3
मैंने सिर्फ एक अधिसूचना पर ध्यान दिया है कि मैंने इस उत्तर को अस्वीकार कर दिया है - मैंने इसे गलती से क्लिक किया होगा; दुर्भाग्य से इंटरफ़ेस मुझे इसे पूर्ववत नहीं करने देगा (यह कहता है कि मैं अपना वोट तब तक नहीं बदल सकता जब तक कि जवाब संपादित नहीं किया जाता ...)। तो, क्रिस डेनेट के लिए माफी।
पीटर हैनले

13

रैंडम इंडेक्स जेनरेट करने के लिए आप उस इंडेक्स पर रैंडम जेनरेटर का इस्तेमाल कर सकते हैं।

//initialization
Random generator = new Random();
int randomIndex = generator.nextInt(myArray.length);
return myArray[randomIndex];

9

यदि आप कई बार एक यादृच्छिक तत्व प्राप्त करने जा रहे हैं, तो आप यह सुनिश्चित करना चाहते हैं कि आपका यादृच्छिक संख्या जनरेटर केवल एक बार आरंभीकृत हो।

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)]; 
    }
}

3

java.util.Random0 और सरणी लंबाई के बीच एक यादृच्छिक संख्या उत्पन्न करने के लिए उपयोग करें: random_numberऔर फिर पूर्णांक प्राप्त करने के लिए यादृच्छिक संख्या का उपयोग करें:array[random_number]



2

आप भी उपयोग कर सकते हैं

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


Math.random () एक डबल वापसी और एक int नहीं। अगर यह होता तो दो संभावित मान 0 और 1. होते।
अक्षय आर।

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

इस प्रश्न पर एक नज़र डालें:

मैं जावा में एक विशिष्ट सीमा के भीतर यादृच्छिक पूर्णांक कैसे उत्पन्न करूं?

आप अपनी पूर्णांक लंबाई से 0 से एक यादृच्छिक संख्या उत्पन्न करना चाहते हैं - 1. तो बस अपने सरणी से अपने int प्राप्त करें:

myArray[myRandomNumber];

0

जावा में java.util पैकेज में रैंडम क्लास है। इसका उपयोग करके आप निम्नलिखित कार्य कर सकते हैं:

Random rnd = new Random();
int randomNumberFromArray = array[rnd.nextInt(3)];

उम्मीद है की यह मदद करेगा!


0
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)]);
       }
}

0

आप भी इस तरीके को आजमा सकते हैं।

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)स्मृति के साथ हल किया जा सके ...?
जारोस्लाव पावलक

हां, आप सही हैं, निरंतर समय और अंतरिक्ष जटिलता के साथ करना बेहतर था।
रवि सपरिया

0
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)]);
        });
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.