কিভাবে অ্যারে থেকে এলোমেলোভাবে একটি উপাদান বাছাই


101

আমি একটি সংখ্যার অ্যারে থেকে এলোমেলোভাবে সংখ্যা বাছাইয়ের সমাধান খুঁজছি।

উদাহরণস্বরূপ আমার একটি অ্যারে রয়েছে new int[]{1,2,3}, আমি এলোমেলোভাবে কীভাবে একটি নম্বর বাছতে পারি?


উত্তর:


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

4
হ্যাঁ, কিন্তু আপনি বলতে করেছি generatorএকটি দৃষ্টান্ত হলjava.util.Random
stivlo

26
Random()আপনি যখন প্রতিটি ফাংশনটি চালাবেন আমি তৈরি করব না : এলোমেলো জেনারেটরের ইতিহাস থাকার কথা। যদি এটি না থাকে তবে এটি অত্যন্ত অনুমানযোগ্য। এটি array[(int)(System.currentTimeMillis() % array.length)]এক্ষেত্রে মোটেও সমস্যা নয় - তবে এটি উল্লেখ করা উচিত যা প্রস্তাবিত সমাধানের মতোই দুর্দান্ত।
ALF

7
@ এলএফ, প্রস্তাবিত সমাধানের থেকে এটি অনেক দূরে। new Random()পূর্বে তৈরির চেয়ে আলাদা বীজ রয়েছে এমন একটি দৃষ্টান্ত তৈরি করার চেষ্টা করে Random। আপনার পদ্ধতির অল্প সময়ের মধ্যে দু'বার ফাংশনটি শুরু করে মারাত্মকভাবে ভেঙে যায়।
আইয়ুব

4
@ কিছু কিছু সিস্টেমে এক মিলিসেকেন্ডের সঠিক টুথ নেই যা কিছু অপশনকে বাদ দিতে পারে যদিgcd(array.length,clockAccuracy)!=1
রাচেট ফ্রিক

4
আমি সবেমাত্র একটি বিজ্ঞপ্তি লক্ষ্য করেছি যে আমি এই উত্তরটিকে হ্রাস পেয়েছি - আমি অবশ্যই এটি দুর্ঘটনাক্রমে ক্লিক করেছি; দুর্ভাগ্যক্রমে ইন্টারফেস আমাকে এটিকে পূর্বাবস্থায় ফেরাতে দেবে না (এটি বলে যে উত্তরটি সম্পাদনা না করা হলে আমি আমার ভোট পরিবর্তন করতে পারি না ...)। সুতরাং, ক্রিস ডেনেটের কাছে ক্ষমা চাই।
পিটার হ্যানলি

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

যদি আপনি এলোমেলোভাবে অ্যারে উপাদানগুলি বেছে নিয়ে থাকেন যা অপ্রত্যাশিত হওয়া প্রয়োজন, আপনার ব্যবহার করা উচিত জাভা.সিকিউরিটি ecসিকিউর র্যান্ডম বদলে এলোমেলো। এটি নিশ্চিত করে যে কেউ যদি শেষ কয়েকটি বাছাই জানেন তবে তাদের পরেরটি অনুমান করার কোনও সুবিধা থাকবে না।

আপনি একটি অবজেক্ট অ্যারের জেনেরিক্স ব্যবহার থেকে একটি র্যান্ডম সংখ্যা বাছাই করতে খুঁজছি হয়, আপনি (সূত্র লোকের ফলে জন্য একটি পদ্ধতি সংজ্ঞায়িত করতে পারে অবিনাশ আর মধ্যে স্ট্রিং অ্যারে থেকে এলোমেলো উপাদান ):

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.0array.length

কাস্ট করা intআপনাকে 0(সমেত) এবং array.length-1(সমেত) এর মধ্যে পূর্ণসংখ্যা প্রদান করবে


ম্যাথ.আরন্ডম () একটি ডাবল ফিরিয়ে দেয় এবং কোন ইনট নয়। যদি সেখানে হতো মাত্র দুই সম্ভাব্য মান 0 এবং 1 এর হবে
অক্ষয় আর

1

যেহেতু আপনার জাভা 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

আপনি এই পদ্ধতির চেষ্টা করতে পারেন ..

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)স্মৃতি দিয়ে সমাধান করা যেতে পারে ...?
জারোসলা পাবলাক

হ্যাঁ, আপনি ঠিক বলেছেন, ধ্রুবক সময় এবং স্থান জটিলতার সাথে করাই ভাল ছিল।
রবি সাপরিয়া

-1

জাভা ju.util প্যাকেজে একটি র্যান্ডম ক্লাস রয়েছে। এটি ব্যবহার করে আপনি নিম্নলিখিতগুলি করতে পারেন:

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

আশাকরি এটা সাহায্য করবে!


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

-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)]);
        });
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.